{"components":{"schemas":{"APIKeyCount":{"properties":{"count":{"description":"The number of API keys for the organization.","title":"Count","type":"integer"}},"required":["count"],"title":"APIKeyCount","type":"object"},"APIKeyCreate":{"properties":{"expire_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The date and time when the API key will expire. If not provided, the API key will never expire.","title":"Expire At"},"name":{"description":"The unique name of the API key.","maxLength":255,"minLength":1,"title":"Name","type":"string"},"scope":{"anyOf":[{"$ref":"#/components/schemas/APIKeyScope"},{"type":"null"}],"description":"What the key may do. Defaults to the most the workspace's plan allows: write on a paid plan, read on the free plan."}},"required":["name"],"title":"APIKeyCreate","type":"object"},"APIKeyCreatedSchema":{"description":"A key the moment it is made: the only response that carries the secret.\n\nIts own schema rather than a nullable field on ``APIKeyRead``, so no read\nroute can grow a path that serves the value back by accident.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"expire_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Expire At"},"id":{"format":"uuid","title":"Id","type":"string"},"key":{"description":"The key's value. Shown here and nowhere else, ever: only a hash is stored. Copy it now; a lost key has to be replaced.","title":"Key","type":"string"},"key_prefix":{"description":"The first characters of the key's value, so it can be told apart from another in a list. The value itself is shown once, when the key is created, and is not recoverable afterwards.","title":"Key Prefix","type":"string"},"last_used_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this key last authenticated a request, to the minute.","title":"Last Used At"},"name":{"title":"Name","type":"string"},"org_id":{"title":"Org Id","type":"string"},"scope":{"$ref":"#/components/schemas/APIKeyScope","description":"What the key may do. A read key may call read endpoints only; a write key may call everything the workspace's plan allows."},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","org_id","name","scope","key_prefix","created_at","updated_at","key"],"title":"APIKeyCreatedSchema","type":"object"},"APIKeyRead":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"expire_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Expire At"},"id":{"format":"uuid","title":"Id","type":"string"},"key_prefix":{"description":"The first characters of the key's value, so it can be told apart from another in a list. The value itself is shown once, when the key is created, and is not recoverable afterwards.","title":"Key Prefix","type":"string"},"last_used_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this key last authenticated a request, to the minute.","title":"Last Used At"},"name":{"title":"Name","type":"string"},"org_id":{"title":"Org Id","type":"string"},"scope":{"$ref":"#/components/schemas/APIKeyScope","description":"What the key may do. A read key may call read endpoints only; a write key may call everything the workspace's plan allows."},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","org_id","name","scope","key_prefix","created_at","updated_at"],"title":"APIKeyRead","type":"object"},"APIKeyScope":{"description":"What a key may do.\n\nTwo values, not a permission matrix. The thing worth stopping is a write\nnobody watched: a leaked read key exposes\nwhat the dashboard already shows the holder, a leaked write key spends\ncredits and sends mail. A free workspace may only mint ``READ``.","enum":["read","write"],"title":"APIKeyScope","type":"string"},"APIKeyScopesReadSchema":{"description":"Which scopes this workspace's plan lets it mint, for the create form.","properties":{"scopes":{"description":"The scopes on offer. A workspace that does not pay gets read only.","items":{"$ref":"#/components/schemas/APIKeyScope"},"title":"Scopes","type":"array"}},"required":["scopes"],"title":"APIKeyScopesReadSchema","type":"object"},"APIKeyUpdate":{"properties":{"expire_at":{"anyOf":[{"format":"date-time","type":"string"},{},{"type":"null"}],"description":"The date and time when the API key will expire. If not provided, the API key will never expire.","title":"Expire At"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{}],"description":"The unique name of the API key.","title":"Name"}},"title":"APIKeyUpdate","type":"object"},"ActionApproveBatchResponseSchema":{"description":"What became of each card in one Approve all.","properties":{"actions":{"description":"Every card named, in the order asked for, as it stands now: applied, or failed with the reason on the card. A card that had already been decided comes back unchanged.","items":{"$ref":"#/components/schemas/ActionProposalReadSchema"},"title":"Actions","type":"array"}},"required":["actions"],"title":"ActionApproveBatchResponseSchema","type":"object"},"ActionApproveBatchSchema":{"description":"Approve every card one reply raised, with one answer about next time.","properties":{"proposal_ids":{"description":"The cards to approve, normally every card in one reply's batch. Each is applied on its own: one that fails does not stop the rest.","items":{"format":"uuid","type":"string"},"maxItems":50,"minItems":1,"title":"Proposal Ids","type":"array"},"scope":{"$ref":"#/components/schemas/ApprovalScope","default":"once","description":"How far the approval reaches, applied to every card in the list."}},"required":["proposal_ids"],"title":"ActionApproveBatchSchema","type":"object"},"ActionApproveSchema":{"description":"Approve a proposal, and say whether the next one like it should still ask.","properties":{"scope":{"$ref":"#/components/schemas/ApprovalScope","default":"once","description":"How far this approval reaches. `once` decides this card and nothing else. `thread` allows the operation for the rest of this conversation. `project_me` allows it for you everywhere in this workspace, and `project_all` for everybody in it. A send is never grantable and always asks again, whatever is chosen here."}},"title":"ActionApproveSchema","type":"object"},"ActionConflictResponseSchema":{"description":"A decision the proposal's state no longer allows: already decided, or not reversible.","properties":{"detail":{"title":"Detail","type":"string"}},"required":["detail"],"title":"ActionConflictResponseSchema","type":"object"},"ActionProposalListResponseSchema":{"description":"A conversation's proposals in the order they were made.","properties":{"actions":{"items":{"$ref":"#/components/schemas/ActionProposalReadSchema"},"title":"Actions","type":"array"},"total_count":{"title":"Total Count","type":"integer"}},"required":["actions","total_count"],"title":"ActionProposalListResponseSchema","type":"object"},"ActionProposalReadSchema":{"description":"One action the assistant proposed or applied, and what became of it: the card.\n\nPrices are quoted in credits, never tenths, and never as a raw id: who\ndecided is a display name resolved at this boundary. ``applied_result``\nis the verb's own record of what it made (the new column's id, the rows\nenrolled), which is what the card links to.","properties":{"applied_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"The verb's or tool's own record of what it made; null until applied. A tool card carries `content` (what the assistant read back), `link` (an app path to the thing), `link_label` (its name), `entity_id`, `opens` (whether the page should go to the link when this lands) and `made` (what was created, for the AI-made mark), plus any facts the tool added.","title":"Applied Result"},"approve_label":{"description":"What the Approve button says: \"Approve\", or with the most it spends, \"Approve · up to 8 credits\", or with a flat price, \"Approve · 8 credits\", or per day, \"Approve · up to 145 credits a day\".","title":"Approve Label","type":"string"},"batch_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Cards the assistant raised together in one reply share this, so they can be shown and approved as a group. Null for a card raised on its own.","title":"Batch Id"},"charged_credits":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"What the run this card started was charged, in credits, once it finished. Null until then, and for every card that starts no run.","title":"Charged Credits"},"conversation_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Conversation Id"},"decided_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Decided At"},"decided_by_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided By Display Name"},"destructive":{"default":false,"description":"Whether approving this removes something. A destructive card is drawn apart from the safe ones, is never offered a standing grant, and is listed on its own in the confirm an Approve all opens.","title":"Destructive","type":"boolean"},"detail":{"anyOf":[{"$ref":"#/components/schemas/ProposalDetailSchema"},{"type":"null"}],"description":"What the card shows under its summary, when one line is not enough to decide on: a prompt being rewritten, an email being reworded. Null for most cards, which say it all in the summary."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why an approval failed to apply, in plain words; null otherwise.","title":"Error"},"expected_credits":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"What the run usually costs, in credits, read from what the same kind of cell has been charged before; equal to price_credits for a flat price, which the card then says as one figure. Null for a card whose price is the whole story.","title":"Expected Credits"},"grantable":{"description":"Whether the card may offer Approve and allow in this conversation: only a pending proposal of a verb that is not a send.","title":"Grantable","type":"boolean"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"$ref":"#/components/schemas/ProposalKind","description":"`verb` for one of the eight workspace actions, `tool` for an API operation the assistant asked to call on your behalf."},"loss":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What approving a destructive card takes away, and whether it comes back, in one sentence; null when nothing is removed.","title":"Loss"},"message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Message Id"},"origin":{"$ref":"#/components/schemas/ProposalOrigin"},"prepared_column":{"anyOf":[{"$ref":"#/components/schemas/PreparedColumnSchema"},{"type":"null"}],"description":"The column this card created before it was decided, so it can be opened from the card while it waits. Null for every other card. Approving runs the column; dismissing removes it, because adding it and running it were one decision."},"price_aside":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What a waiting card says beside its Approve button, when the button does not say it all: \"usually about 24\", \"Free\", \"Free to build · sending about 45 credits\". Null when the button says everything.","title":"Price Aside"},"price_credits":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The published price of the operation when it was proposed, in credits; null when free.","title":"Price Credits"},"price_label":{"description":"What the card says it costs: \"Free\", or the most it can spend, \"Up to 16.5 credits\"; for a run charged by use, \"Up to 65 credits · usually about 24\"; for a flat price (a run of enrichments that each have one price), the one figure, \"2,800 credits\"; once that run has ended, \"Charged 23.8 credits\"; and for a card priced per day, \"Up to 145 credits a day\", before and after it is approved.","title":"Price Label","type":"string"},"price_per":{"$ref":"#/components/schemas/PricePer","default":"call","description":"What price_credits is the price of. `call`: the most approving this card may spend, once. `day`: the card starts something that keeps spending by itself (no tool raises one today), and price_credits is the most one day may cost (\"Approve · up to 145 credits a day\"). A total of several cards, such as Approve all's, leaves a `day` card out of its one-off sum."},"proposed_at":{"format":"date-time","title":"Proposed At","type":"string"},"runs_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The column approving this card runs, while the card waits: the one it added, or one already on the table that it names. Lets the column's own panel approve this card instead of starting a second run. Null for a card that runs no column, and once the card is decided.","title":"Runs Column Id"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The agent column whose run raised the card; null for every other origin. What puts a card on its table's page when its arguments name a sequence or a destination instead of the table.","title":"Source Column Id"},"source_record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The row the agent was working on when it raised the card; null otherwise.","title":"Source Record Id"},"status":{"$ref":"#/components/schemas/ProposalStatus"},"summary":{"title":"Summary","type":"string"},"verb":{"description":"What the card proposes: one of the eight workspace verbs, or the name of an API operation the assistant asked to call. `kind` says which.","title":"Verb","type":"string"},"verb_label":{"title":"Verb Label","type":"string"}},"required":["id","origin","conversation_id","message_id","source_column_id","source_record_id","verb","kind","batch_id","verb_label","summary","price_credits","price_label","approve_label","price_aside","status","proposed_at","decided_at","decided_by_display_name","applied_result","error","grantable"],"title":"ActionProposalReadSchema","type":"object"},"ActivityDecision":{"description":"Who let one unit of outreach go, or refused it.\n\n``APPROVED``: a person (or an API key) approved it before it went.\n``AUTOMATIC``: nobody was asked; the sender's or the sequence's rules let\nit go. ``REJECTED``: a person refused it, so it never went.\n``SENT_BY_PERSON``: a person wrote it and sent it themselves, from the inbox.\n``NOT_RECORDED``: a LinkedIn step that ran before Activity existed whose\napproval a later step of the same contact has since overwritten; saying so\nis truer than guessing.","enum":["approved","automatic","rejected","sent_by_person","not_recorded"],"title":"ActivityDecision","type":"string"},"ActivityOutcome":{"description":"How one unit of outreach ended.\n\n``SENT`` is an email the provider accepted; ``DONE`` a LinkedIn step that\ndid its job, the word both LinkedIn surfaces use. ``SKIPPED`` is a step that\ndid not apply or was passed over in the extension; ``ALREADY_PENDING`` the\none skip every LinkedIn surface names apart, a connection request somebody\nhad already sent; ``STOPPED`` one stopped while a browser ran it.\n``NOT_SENT`` is a task a person refused, which never reached its channel.","enum":["sent","done","failed","skipped","already_pending","stopped","not_sent"],"title":"ActivityOutcome","type":"string"},"ActorKind":{"description":"Who authorised an action.","enum":["user","api","system"],"title":"ActorKind","type":"string"},"AddAgentToTableRequestSchema":{"description":"Deploy a saved agent onto this table as a linked enrichment column.","properties":{"column_name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"What to call the parent column; the agent's own name when omitted. Worth asking for: the name labels the fan-out group, it is the only column visible while that group is collapsed, and for a single-output agent it IS the answer column. It is also the only way to deploy one agent onto a table twice.","title":"Column Name"},"input_mappings":{"additionalProperties":{"format":"uuid","type":"string"},"description":"Which table column (id) feeds each agent input (by the input's id).","propertyNames":{"format":"uuid"},"title":"Input Mappings","type":"object"},"output_column_names":{"additionalProperties":{"maxLength":255,"minLength":1,"type":"string"},"description":"What to call each fanned-out child column, keyed by output field name. The setup dialog previews these names, so it sends every one it showed rather than only the edited ones. A preview is worth having only if it is what the table gets. A field with no entry keeps the derived name, and a name already taken falls back to the derived one rather than losing the column.","maxProperties":50,"propertyNames":{"maxLength":100,"minLength":1},"title":"Output Column Names","type":"object"},"output_field_names":{"description":"The output fields to fan out into their own columns.","items":{"maxLength":100,"minLength":1,"type":"string"},"maxItems":50,"title":"Output Field Names","type":"array"},"position":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"Insert position; appended when omitted. Places the parent column, and its fanned-out children land immediately after it, so one position anchors the whole group where the author clicked.","title":"Position"},"run_rows":{"anyOf":[{"maximum":50.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Rows to run once the column exists, counted from the top of the table's own order. Omit to create it unrun, so the author can adjust the mapping before spending credits. Bounded deliberately: there is no 'run all' here at any value.","title":"Run Rows"},"saved_agent_id":{"description":"The saved agent to deploy.","format":"uuid","title":"Saved Agent Id","type":"string"},"use_row_context":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the deployed column folds the rest of the row in as context, decided HERE rather than inherited. Null keeps the agent's own stored answer, which is what a client that does not ask the question should get; the setup dialog always sends an explicit value, because whether a run reads the whole row is a per-table decision and the agent's flag was set somewhere else entirely. Stamped onto the column either way. Reading the agent's live value on every run would let a later edit silently change what a deployed column sends.","title":"Use Row Context"}},"required":["saved_agent_id"],"title":"AddAgentToTableRequestSchema","type":"object"},"AffiliateCodeReadSchema":{"description":"One of the affiliate's codes.","properties":{"code":{"title":"Code","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"is_vanity":{"title":"Is Vanity","type":"boolean"}},"required":["code","is_vanity","created_at"],"title":"AffiliateCodeReadSchema","type":"object"},"AffiliateDailyStatReadSchema":{"description":"One day of the per-day graph series. Quiet days are present, as zeroes.","properties":{"clicks":{"title":"Clicks","type":"integer"},"conversions":{"title":"Conversions","type":"integer"},"day":{"format":"date","title":"Day","type":"string"},"earned_cents":{"title":"Earned Cents","type":"integer"},"signups":{"title":"Signups","type":"integer"}},"required":["day","clicks","signups","conversions","earned_cents"],"title":"AffiliateDailyStatReadSchema","type":"object"},"AffiliateEnrollRequestSchema":{"description":"The one thing enrollment asks for: what to call the affiliate.","properties":{"display_name":{"description":"The name shown to referred users in welcome copy.","maxLength":255,"minLength":1,"title":"Display Name","type":"string"}},"required":["display_name"],"title":"AffiliateEnrollRequestSchema","type":"object"},"AffiliateFeedItemKind":{"description":"What one anonymous activity-feed row reports.","enum":["signup","conversion","commission","clawback","payout","forfeiture"],"title":"AffiliateFeedItemKind","type":"string"},"AffiliateFeedItemReadSchema":{"description":"One anonymous activity-feed row.","properties":{"amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Signed cents for money rows; null for signup and conversion rows.","title":"Amount Cents"},"kind":{"$ref":"#/components/schemas/AffiliateFeedItemKind"},"occurred_at":{"format":"date-time","title":"Occurred At","type":"string"}},"required":["kind","occurred_at","amount_cents"],"title":"AffiliateFeedItemReadSchema","type":"object"},"AffiliateLedgerEntryKind":{"description":"The kind of an affiliate ledger entry. Amounts are signed USD cents.","enum":["commission","clawback_refund","clawback_dispute","dispute_reversal","payout","adjustment","forfeiture"],"title":"AffiliateLedgerEntryKind","type":"string"},"AffiliateLedgerEntryReadSchema":{"description":"One signed movement of affiliate money.","properties":{"amount_cents":{"title":"Amount Cents","type":"integer"},"available_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a commission matures into the payable balance; null for immediate kinds.","title":"Available At"},"currency":{"title":"Currency","type":"string"},"description":{"title":"Description","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"$ref":"#/components/schemas/AffiliateLedgerEntryKind"},"occurred_at":{"format":"date-time","title":"Occurred At","type":"string"}},"required":["id","kind","amount_cents","currency","description","occurred_at","available_at"],"title":"AffiliateLedgerEntryReadSchema","type":"object"},"AffiliateMaturityReadSchema":{"description":"One future day on which pending commission becomes payable.","properties":{"amount_cents":{"title":"Amount Cents","type":"integer"},"day":{"format":"date","title":"Day","type":"string"},"running_available_cents":{"description":"The payable balance once this day has matured, absent clawbacks and payouts.","title":"Running Available Cents","type":"integer"}},"required":["day","amount_cents","running_available_cents"],"title":"AffiliateMaturityReadSchema","type":"object"},"AffiliateNextPayoutStatus":{"description":"What the next monthly run will do with this affiliate's balance.\n\nDerived from the same gates the payout engine applies, so the sentence the\ndashboard prints and the decision the run makes cannot disagree. Every\n\"your payout goes out on the 1st\" used to be unconditional, which made it\nfalse for a first payout (held for a human), a blocked affiliate (no\nidentity check, no PayPal address, a fresh address inside its hold), a\nsuspended or banned account, a balance under the minimum, and the whole\nperiod the program ships with payouts switched off.","enum":["paused","unavailable","under_review","blocked","below_minimum","scheduled"],"title":"AffiliateNextPayoutStatus","type":"string"},"AffiliatePayoutReadSchema":{"description":"One monthly payout.","properties":{"amount_cents":{"title":"Amount Cents","type":"integer"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"paid_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Paid At"},"period":{"title":"Period","type":"string"},"status":{"$ref":"#/components/schemas/AffiliatePayoutStatus"}},"required":["id","period","amount_cents","status","paid_at","created_at"],"title":"AffiliatePayoutReadSchema","type":"object"},"AffiliatePayoutStatus":{"description":"Where one monthly payout is in the PayPal Payouts lifecycle.","enum":["held","created","paid","unclaimed","returned","failed"],"title":"AffiliatePayoutStatus","type":"string"},"AffiliatePerformanceReadSchema":{"description":"Everything the affiliate overview measures over one window.","properties":{"active_count":{"description":"Referrals still inside their commission window.","title":"Active Count","type":"integer"},"average_commission_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Lifetime gross commission per paying referral. Null with none yet.","title":"Average Commission Cents"},"clears_minimum_on":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"description":"The day the payable balance first clears the payout minimum on that schedule. Null when it already has, or when it never does.","title":"Clears Minimum On"},"clicks":{"$ref":"#/components/schemas/AffiliateTrendReadSchema"},"conversion_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Paying referrals per signup, lifetime, 0-1. Null below the honesty floor.","title":"Conversion Rate"},"conversions":{"$ref":"#/components/schemas/AffiliateTrendReadSchema"},"days":{"description":"The window length these figures cover.","title":"Days","type":"integer"},"earned_cents":{"$ref":"#/components/schemas/AffiliateTrendReadSchema"},"epc_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Commission earned per click over the window. Null below the honesty floor.","title":"Epc Cents"},"held_cents":{"description":"Money in a payout waiting on human review. Still counted in the available balance until it is released.","title":"Held Cents","type":"integer"},"last_commission_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Commission At"},"last_conversion_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Conversion At"},"last_signup_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Signup At"},"lifetime_clawed_back_cents":{"description":"What refunds and disputes took back, as a positive magnitude.","title":"Lifetime Clawed Back Cents","type":"integer"},"lifetime_gross_cents":{"title":"Lifetime Gross Cents","type":"integer"},"lifetime_net_cents":{"title":"Lifetime Net Cents","type":"integer"},"never_paid_count":{"description":"Referrals that have not started a paid plan.","title":"Never Paid Count","type":"integer"},"next_payout_blocker":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When blocked, which gate: identity_not_verified, no_payout_email or destination_hold.","title":"Next Payout Blocker"},"next_payout_cents":{"description":"What that run would send on today's numbers plus what matures before it.","title":"Next Payout Cents","type":"integer"},"next_payout_on":{"description":"The date of the next monthly payout run.","format":"date","title":"Next Payout On","type":"string"},"next_payout_status":{"$ref":"#/components/schemas/AffiliateNextPayoutStatus","description":"Whether that run will actually send anything: scheduled, below the minimum, blocked on a step the affiliate can take, under human review, paused program-wide, or unavailable to this account."},"signup_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Signups per click over the window, 0-1. Null when there were too few clicks for the figure to mean anything.","title":"Signup Rate"},"signups":{"$ref":"#/components/schemas/AffiliateTrendReadSchema"},"upcoming_maturities":{"description":"The next days pending commission becomes payable on, soonest first.","items":{"$ref":"#/components/schemas/AffiliateMaturityReadSchema"},"title":"Upcoming Maturities","type":"array"},"window_closed_count":{"description":"Referrals whose commission window has ended.","title":"Window Closed Count","type":"integer"}},"required":["days","clicks","signups","conversions","earned_cents","signup_rate","conversion_rate","epc_cents","average_commission_cents","lifetime_gross_cents","lifetime_clawed_back_cents","lifetime_net_cents","never_paid_count","active_count","window_closed_count","upcoming_maturities","clears_minimum_on","next_payout_on","next_payout_cents","next_payout_status","next_payout_blocker","held_cents","last_signup_at","last_conversion_at","last_commission_at"],"title":"AffiliatePerformanceReadSchema","type":"object"},"AffiliateProfileReadSchema":{"description":"The caller's own standing in the affiliate program.","properties":{"contact_email":{"title":"Contact Email","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"display_name":{"title":"Display Name","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"identity_verified_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Identity Verified At"},"paypal_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paypal Email"},"paypal_email_confirmed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Paypal Email Confirmed At"},"status":{"$ref":"#/components/schemas/AffiliateStatus"}},"required":["id","status","display_name","contact_email","identity_verified_at","paypal_email","paypal_email_confirmed_at","created_at"],"title":"AffiliateProfileReadSchema","type":"object"},"AffiliateProgramReadSchema":{"description":"What the affiliate program pays right now: the public half of the offer.","properties":{"conversion_deadline_days":{"description":"Days after signup within which a referral must start paying for the stamped terms to hold; later conversions earn the standard schedule.","title":"Conversion Deadline Days","type":"integer"},"duration_months":{"description":"How many months of that customer's payments the rate applies to.","title":"Duration Months","type":"integer"},"launch_offer_active":{"description":"Whether the launch offer currently applies.","title":"Launch Offer Active","type":"boolean"},"launch_offer_ends_on":{"description":"The last day of the launch offer, unless ended earlier.","format":"date","title":"Launch Offer Ends On","type":"string"},"payout_minimum_cents":{"description":"Available balance, in USD cents, below which a monthly payout rolls over.","title":"Payout Minimum Cents","type":"integer"},"pending_days":{"description":"How long an earned commission stays pending before it is payable.","title":"Pending Days","type":"integer"},"rate_bps":{"description":"Commission rate a customer attributed today is stamped with, in basis points.","title":"Rate Bps","type":"integer"},"standard_duration_months":{"description":"The standard duration, in months, outside the launch offer.","title":"Standard Duration Months","type":"integer"},"standard_rate_bps":{"description":"The standard rate, in basis points, outside the launch offer.","title":"Standard Rate Bps","type":"integer"}},"required":["rate_bps","duration_months","standard_rate_bps","standard_duration_months","launch_offer_active","launch_offer_ends_on","conversion_deadline_days","pending_days","payout_minimum_cents"],"title":"AffiliateProgramReadSchema","type":"object"},"AffiliateReferralReadSchema":{"description":"One referred workspace, anonymized, with its own terms and earnings.","properties":{"clawed_back_cents":{"description":"What refunds and disputes took back off it, as a positive magnitude.","title":"Clawed Back Cents","type":"integer"},"commission_months":{"description":"How many months this referral pays commission for.","title":"Commission Months","type":"integer"},"commission_rate_bps":{"description":"The rate stamped on THIS referral, which the program's current offer does not change.","title":"Commission Rate Bps","type":"integer"},"commission_window_ends_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this referral stops earning; null until it converts.","title":"Commission Window Ends At"},"converted_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this referral first started paying; null while still on the free plan.","title":"Converted At"},"earned_cents":{"description":"Gross commission this referral has produced.","title":"Earned Cents","type":"integer"},"id":{"format":"uuid","title":"Id","type":"string"},"last_payment_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Payment At"},"payment_count":{"description":"How many commission payments it has produced.","title":"Payment Count","type":"integer"},"signed_up_at":{"format":"date-time","title":"Signed Up At","type":"string"},"source":{"description":"The link tag this referral arrived under, if any.","title":"Source","type":"string"}},"required":["id","source","commission_rate_bps","commission_months","signed_up_at","converted_at","commission_window_ends_at","earned_cents","clawed_back_cents","payment_count","last_payment_at"],"title":"AffiliateReferralReadSchema","type":"object"},"AffiliateSourceStatReadSchema":{"description":"How one traffic source the affiliate tagged has performed.","properties":{"clicks":{"title":"Clicks","type":"integer"},"earned_cents":{"title":"Earned Cents","type":"integer"},"paying":{"title":"Paying","type":"integer"},"signups":{"title":"Signups","type":"integer"},"source":{"description":"The affiliate's own link tag; empty string for untagged traffic.","title":"Source","type":"string"}},"required":["source","clicks","signups","paying","earned_cents"],"title":"AffiliateSourceStatReadSchema","type":"object"},"AffiliateStatsReadSchema":{"description":"The affiliate dashboard's headline numbers.","properties":{"available_cents":{"description":"Payable balance; negative when clawbacks exceed earnings.","title":"Available Cents","type":"integer"},"click_count":{"description":"Deduplicated, bot-filtered clicks on the affiliate's links.","title":"Click Count","type":"integer"},"lifetime_earned_cents":{"description":"All commission ever accrued.","title":"Lifetime Earned Cents","type":"integer"},"lifetime_paid_cents":{"description":"All payouts ever sent.","title":"Lifetime Paid Cents","type":"integer"},"paying_count":{"description":"Of those, how many are on a paid plan.","title":"Paying Count","type":"integer"},"pending_cents":{"description":"Commission still inside the pending window.","title":"Pending Cents","type":"integer"},"registered_count":{"description":"Workspaces that signed up through the links.","title":"Registered Count","type":"integer"}},"required":["click_count","registered_count","paying_count","pending_cents","available_cents","lifetime_earned_cents","lifetime_paid_cents"],"title":"AffiliateStatsReadSchema","type":"object"},"AffiliateStatus":{"description":"Whether an affiliate may earn and be paid.","enum":["active","suspended","banned"],"title":"AffiliateStatus","type":"string"},"AffiliateSummaryReadSchema":{"description":"Everything the affiliate dashboard's overview needs in one read.","properties":{"code":{"description":"The minted default code.","title":"Code","type":"string"},"display_name":{"title":"Display Name","type":"string"},"link":{"description":"The full URL to share, using the vanity code when claimed.","title":"Link","type":"string"},"profile":{"$ref":"#/components/schemas/AffiliateProfileReadSchema"},"program":{"$ref":"#/components/schemas/AffiliateProgramReadSchema"},"stats":{"$ref":"#/components/schemas/AffiliateStatsReadSchema"},"status":{"$ref":"#/components/schemas/AffiliateStatus"},"vanity_code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The claimed custom code, when one exists.","title":"Vanity Code"}},"required":["status","display_name","code","vanity_code","link","stats","program","profile"],"title":"AffiliateSummaryReadSchema","type":"object"},"AffiliateTrendReadSchema":{"description":"One metric over a window, against the window immediately before it.","properties":{"current":{"title":"Current","type":"integer"},"previous":{"title":"Previous","type":"integer"}},"required":["current","previous"],"title":"AffiliateTrendReadSchema","type":"object"},"AgentAttemptAnswerSchema":{"description":"What the browser does with a step after one of its runs was cut off.","properties":{"attempt":{"description":"Which attempt this was.","title":"Attempt","type":"integer"},"attempts_left":{"description":"How many counted attempts remain before the step stops.","title":"Attempts Left","type":"integer"},"claim_expires_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The claim's lease, extended, read against server_now; null unless it goes on.","title":"Claim Expires At"},"next_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The run that may press now; null unless the step goes on.","title":"Next Run Id"},"server_now":{"description":"The server's clock when it answered.","format":"date-time","title":"Server Now","type":"string"},"verdict":{"$ref":"#/components/schemas/LinkedInAttemptVerdict","description":"retry: run it again as next_run_id. look_first: run it again, looking on LinkedIn before any press (verification). stop: it was cut off too often and is settled failed; post nothing. lost: the claim is not this browser's any more; post nothing. not_retryable: the exit is not an interruption, or a press LinkedIn never answered (or a page that never drew) reached the cap; post the result."},"verification":{"anyOf":[{"$ref":"#/components/schemas/AgentAttemptVerificationSchema"},{"type":"null"}],"description":"For look_first: what to look for before acting; null otherwise."}},"required":["verdict","attempt","attempts_left","next_run_id","claim_expires_at","server_now","verification"],"title":"AgentAttemptAnswerSchema","type":"object"},"AgentAttemptSchema":{"description":"A run of the held step cut off without an error from LinkedIn, reported instead of a result.\n\nThe same report again (the same ``stopped_run_id``) gets the same answer and\nchanges nothing, so a report that got no answer is sent again with the same\nids until it does.","properties":{"cause":{"description":"Why the run stopped: person_closed (a person closed the working tab), worker_restarted, page_not_loaded, tab_frozen, identity_no_answer, no_response (LinkedIn never answered a press, or did not say whether it acted), or outage (the server could not be asked). Every cause but person_closed and outage counts against the step. A no_response run, or a page_unsettled one, that reaches the cap is answered not_retryable, and its own failure is posted.","enum":["person_closed","worker_restarted","page_not_loaded","tab_frozen","identity_no_answer","no_response","outage"],"title":"Cause","type":"string"},"claimed_at":{"description":"The step's claim, exactly as the claim handed it out.","format":"date-time","title":"Claimed At","type":"string"},"duration_ms":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"How long the stopped run lasted.","title":"Duration Ms"},"next_run_id":{"description":"The run the step goes on in, named by this browser before it reports.","maxLength":64,"minLength":8,"pattern":"^[A-Za-z0-9_-]+$","title":"Next Run Id","type":"string"},"press_granted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether a press was let through in the stopped run: false when no grant reached it, so it pressed nothing, and a grant first given to it is taken back; null when the browser cannot say.","title":"Press Granted"},"site":{"anyOf":[{"pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string"},{"type":"null"}],"description":"Where the run stopped, a failure_sites.json name; null for an outage.","title":"Site"},"stopped_run_id":{"description":"The run that stopped: the one the press fence may name.","maxLength":64,"minLength":8,"pattern":"^[A-Za-z0-9_-]+$","title":"Stopped Run Id","type":"string"}},"required":["claimed_at","stopped_run_id","next_run_id","cause"],"title":"AgentAttemptSchema","type":"object"},"AgentAttemptVerificationSchema":{"description":"What the next run looks for on LinkedIn before it presses anything.","properties":{"commit_granted_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a press was first granted; null when none was.","title":"Commit Granted At"},"mode":{"$ref":"#/components/schemas/LinkedInLookMode","description":"verify_then_act: look first, finish it if it is not done. verify_only: look and report, never press."}},"required":["mode","commit_granted_at"],"title":"AgentAttemptVerificationSchema","type":"object"},"AgentCommitGrantSchema":{"properties":{"claim_expires_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Granted: press before this, read against server_now, or ask again.","title":"Claim Expires At"},"granted":{"description":"Whether the run may press now.","title":"Granted","type":"boolean"},"refusal":{"anyOf":[{"$ref":"#/components/schemas/LinkedInCommitRefusal"},{"type":"null"}],"description":"Why not: lost (the claim is not this browser's any more), expired (its lease ran out), stale_run (another run of it holds the grant), requeue_at_reset (the day's limit is spent; the step waits for the reset and never fails for it), wait_for_replies (a message not pressed yet while its sender's inbox goes unread or its member's reply waits to be read; back in line, never failed for it)."},"server_now":{"description":"The server's clock when it answered.","format":"date-time","title":"Server Now","type":"string"}},"required":["granted","refusal","claim_expires_at","server_now"],"title":"AgentCommitGrantSchema","type":"object"},"AgentCommitSchema":{"properties":{"claimed_at":{"description":"The step's claim, exactly as the claim handed it out.","format":"date-time","title":"Claimed At","type":"string"},"key":{"description":"Which control is about to be pressed, e.g. send or connect; for the logs.","pattern":"^[a-z][a-z0-9_]{0,31}$","title":"Key","type":"string"},"run_id":{"description":"This browser's run of the step. A new run is started for every resume, and only one run of a claim may press.","maxLength":64,"minLength":8,"pattern":"^[A-Za-z0-9_-]+$","title":"Run Id","type":"string"}},"required":["claimed_at","run_id","key"],"title":"AgentCommitSchema","type":"object"},"AgentConfidence":{"description":"The agent's own read on how solid its final answer is.","enum":["high","medium","low"],"title":"AgentConfidence","type":"string"},"AgentContextSection":{"description":"One section of the org's AI business context a prompt can reference.\n\n``ALL`` is the whole context document; the rest are its named sections.","enum":["all","company","icp","personas","signals","social_proof"],"title":"AgentContextSection","type":"string"},"AgentDiagnosticStoredSchema":{"description":"Whether a page snapshot was kept.","properties":{"stored":{"description":"False when there was no report to attach it to, or a recent one already carries the same evidence.","title":"Stored","type":"boolean"}},"required":["stored"],"title":"AgentDiagnosticStoredSchema","type":"object"},"AgentDiagnosticSummarySchema":{"description":"The small, typed half of a page report, carried on a step's result.\n\nFiled where the browser decided something from what it could not find. The\nsnapshot of the page follows on its own request, so a report can never\ncost the result it rides with.","properties":{"before_commit":{"default":false,"description":"The browser's word that nothing changed on LinkedIn: it pressed no button that sends, follows, likes or withdraws.","title":"Before Commit","type":"boolean"},"checkpoint":{"description":"Where in the step the browser stood, e.g. more_menu.","pattern":"^[a-z][a-z0-9_]{0,63}$","title":"Checkpoint","type":"string"},"config_version":{"anyOf":[{"maximum":2147483647.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"The selector config version the browser ran.","title":"Config Version"},"trigger":{"$ref":"#/components/schemas/LinkedInDiagnosticTrigger","description":"Why the report was filed."}},"required":["trigger","checkpoint"],"title":"AgentDiagnosticSummarySchema","type":"object"},"AgentEffortLevel":{"description":"How hard the Agent works on each row.\n\nNamed levels rather than raw step counts: the level is the user-facing\ncontract, and what each level buys (step and page budgets) is a product\ndecision the loop maps internally. Re-tuning budgets never invalidates\nstored columns.","enum":["low","standard","high"],"title":"AgentEffortLevel","type":"string"},"AgentHeartbeatSchema":{"properties":{"checkpoint":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True when LinkedIn is challenging the account; no work is handed out while it stands. False clears it; null leaves it untouched.","title":"Checkpoint"},"extension_version":{"default":"","maxLength":32,"title":"Extension Version","type":"string"},"lease_nonce":{"description":"This browser's lease identity; only the holder is handed work.","maxLength":64,"minLength":8,"title":"Lease Nonce","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"description":"Who the browser is currently signed in as, for the mismatch guard.","title":"Member Urn"},"running_action_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The step this browser is running right now, sent on the check-ins it makes while it runs; with running_claimed_at it keeps that step's claim from lapsing under a browser still working on it, including one waking from sleep. Null between steps.","title":"Running Action Id"},"running_claimed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the running step was claimed, as the claim handed it out.","title":"Running Claimed At"},"running_phase":{"anyOf":[{"$ref":"#/components/schemas/LinkedInRunPhase"},{"type":"null"}],"description":"How far the running step got, from a build that resumes steps (resume:v1). Reported to the team for a step that never ends (read on /heartbeat/ only), and not kept: the commit grant, not the phase, says whether anything may have changed on LinkedIn."},"running_wait":{"anyOf":[{"$ref":"#/components/schemas/AgentRunningWaitSchema"},{"type":"null"}],"description":"What the running step is waiting on right now; read on /heartbeat/ only, and not kept. One wait past every ceiling (twice the longest a whole step can take) is one nothing will end: the step's claim is taken back, counted against the step as a lapse is, and running_claim answers lost. Reported to the team, as is a step that goes on after it was told its claim is gone."},"supported_kinds":{"anyOf":[{"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":64,"type":"array"},{"type":"null"}],"description":"The step kinds this build can run, and the capabilities it has beyond them (such as profile_view:read_relationship). Nothing is handed to a browser that it cannot run. Leave it out (an older build) and the browser runs the kinds that existed before builds said. Sent on every check-in: a check-in without it reads as such a build.","title":"Supported Kinds"},"timezone":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"The browser's IANA timezone (Intl.DateTimeFormat().resolvedOptions().timeZone). It fills the sender's timezone when the sender has none: their daily limits reset at its midnight and sequences send in its hours. A timezone the sender has is never moved by it. Taken only from the browser driving the account.","title":"Timezone"}},"required":["lease_nonce"],"title":"AgentHeartbeatSchema","type":"object"},"AgentInputMappingSuggestionSchema":{"description":"One suggested table column for an agent input.","properties":{"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Column Id"},"column_is_empty":{"default":false,"description":"True when the suggested column holds no data in this table: runs would skip every row until it is filled or remapped.","title":"Column Is Empty","type":"boolean"},"input_id":{"description":"The declared input this suggestion binds: the deploy request's key.","format":"uuid","title":"Input Id","type":"string"},"input_name":{"description":"The input's display name, the label the mapping row shows.","title":"Input Name","type":"string"}},"required":["input_id","input_name","column_id"],"title":"AgentInputMappingSuggestionSchema","type":"object"},"AgentInputMappingSuggestionsResponseSchema":{"description":"Suggested input→column mappings for deploying an agent onto a table.","properties":{"suggestions":{"items":{"$ref":"#/components/schemas/AgentInputMappingSuggestionSchema"},"title":"Suggestions","type":"array"}},"required":["suggestions"],"title":"AgentInputMappingSuggestionsResponseSchema","type":"object"},"AgentInputSchema":{"description":"One named input a saved agent declares.\n\nThe id is client-minted at declaration time (the editor must be able to\nreference a fresh input before the first save) and is the identity the\nprompt's ``input_ref`` segments and a deployment's mapping key on.","properties":{"id":{"format":"uuid","title":"Id","type":"string"},"name":{"maxLength":100,"minLength":1,"title":"Name","type":"string"}},"required":["id","name"],"title":"AgentInputSchema","type":"object"},"AgentMcpServersSetSchema":{"description":"The exact set of MCP servers an agent should have attached.","properties":{"server_ids":{"description":"The servers to attach to the agent; replaces the current set.","items":{"format":"uuid","type":"string"},"maxItems":20,"title":"Server Ids","type":"array"}},"title":"AgentMcpServersSetSchema","type":"object"},"AgentNextActionSchema":{"properties":{"action":{"anyOf":[{"$ref":"#/components/schemas/LinkedInActionReadSchema"},{"type":"null"}]},"deferred_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deferred Reason"},"earliest_next_action_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Earliest Next Action At"},"queued_count":{"title":"Queued Count","type":"integer"},"verification":{"anyOf":[{"$ref":"#/components/schemas/AgentVerificationSchema"},{"type":"null"}],"description":"Set when the step handed out may already have touched LinkedIn (it stopped and was put back, or a press was granted to an earlier attempt): look on LinkedIn before acting, and a change already there is the step done. Only builds that resume steps (resume:v1) are handed such a step."}},"required":["action","earliest_next_action_at","queued_count","deferred_reason"],"title":"AgentNextActionSchema","type":"object"},"AgentNextRequestSchema":{"properties":{"checkpoint":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True when LinkedIn is challenging the account; no work is handed out while it stands. False clears it; null leaves it untouched.","title":"Checkpoint"},"claim_request_id":{"anyOf":[{"maxLength":64,"minLength":8,"pattern":"^[A-Za-z0-9_-]+$","type":"string"},{"type":"null"}],"description":"This browser's name for this ask, kept until the answer is saved. Asked again under the same name, because the first answer never arrived, the browser gets the step it was handed rather than a second one beside it. Older builds leave it out.","title":"Claim Request Id"},"extension_version":{"default":"","maxLength":32,"title":"Extension Version","type":"string"},"lease_nonce":{"description":"This browser's lease identity; only the holder is handed work.","maxLength":64,"minLength":8,"title":"Lease Nonce","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"description":"Who the browser is currently signed in as, for the mismatch guard.","title":"Member Urn"},"running_action_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The step this browser is running right now, sent on the check-ins it makes while it runs; with running_claimed_at it keeps that step's claim from lapsing under a browser still working on it, including one waking from sleep. Null between steps.","title":"Running Action Id"},"running_claimed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the running step was claimed, as the claim handed it out.","title":"Running Claimed At"},"running_phase":{"anyOf":[{"$ref":"#/components/schemas/LinkedInRunPhase"},{"type":"null"}],"description":"How far the running step got, from a build that resumes steps (resume:v1). Reported to the team for a step that never ends (read on /heartbeat/ only), and not kept: the commit grant, not the phase, says whether anything may have changed on LinkedIn."},"running_wait":{"anyOf":[{"$ref":"#/components/schemas/AgentRunningWaitSchema"},{"type":"null"}],"description":"What the running step is waiting on right now; read on /heartbeat/ only, and not kept. One wait past every ceiling (twice the longest a whole step can take) is one nothing will end: the step's claim is taken back, counted against the step as a lapse is, and running_claim answers lost. Reported to the team, as is a step that goes on after it was told its claim is gone."},"supported_kinds":{"anyOf":[{"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":64,"type":"array"},{"type":"null"}],"description":"The step kinds this build can run, and the capabilities it has beyond them (such as profile_view:read_relationship). Nothing is handed to a browser that it cannot run. Leave it out (an older build) and the browser runs the kinds that existed before builds said. Sent on every check-in: a check-in without it reads as such a build.","title":"Supported Kinds"},"timezone":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"The browser's IANA timezone (Intl.DateTimeFormat().resolvedOptions().timeZone). It fills the sender's timezone when the sender has none: their daily limits reset at its midnight and sequences send in its hours. A timezone the sender has is never moved by it. Taken only from the browser driving the account.","title":"Timezone"},"unmetered_only":{"default":false,"description":"Hand out only a step that waits for no gap between steps (one the Oneprofile team fired to test the sender), or nothing: the ask a build makes inside its own gap when the check-in says one is waiting (unpaced_waiting). Older builds leave it out.","title":"Unmetered Only","type":"boolean"}},"required":["lease_nonce"],"title":"AgentNextRequestSchema","type":"object"},"AgentPairResultSchema":{"properties":{"account_id":{"format":"uuid","title":"Account Id","type":"string"},"agent_token":{"title":"Agent Token","type":"string"},"display_name":{"title":"Display Name","type":"string"},"member_urn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Urn"},"run_mode":{"$ref":"#/components/schemas/LinkedInApprovalMode","description":"The sender's LinkedIn approval setting in force: manual or auto."},"sender_profile_id":{"format":"uuid","title":"Sender Profile Id","type":"string"},"session_id":{"format":"uuid","title":"Session Id","type":"string"}},"required":["agent_token","session_id","account_id","sender_profile_id","member_urn","display_name","run_mode"],"title":"AgentPairResultSchema","type":"object"},"AgentPairSchema":{"description":"The pasted connection token plus what the extension read from the live LinkedIn session.","properties":{"browser_label":{"default":"","description":"How the dashboard names this browser, e.g. 'Chrome on macOS'.","maxLength":128,"title":"Browser Label","type":"string"},"connection_token":{"maxLength":128,"minLength":8,"title":"Connection Token","type":"string"},"display_name":{"default":"","maxLength":255,"title":"Display Name","type":"string"},"extension_version":{"default":"","maxLength":32,"title":"Extension Version","type":"string"},"headline":{"default":"","maxLength":500,"title":"Headline","type":"string"},"lease_nonce":{"anyOf":[{"maxLength":64,"minLength":8,"type":"string"},{"type":"null"}],"description":"The lease identity this browser will use with the new session, named before it pairs and kept until a pairing is answered. A live session of the account already carrying it is this same browser's pairing whose answer was lost, and is signed out first, so asking again never leaves a second entry for one browser.","title":"Lease Nonce"},"member_urn":{"maxLength":128,"minLength":3,"title":"Member Urn","type":"string"},"photo_url":{"anyOf":[{"maxLength":1000,"type":"string"},{"type":"null"}],"title":"Photo Url"},"previous_session_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The session this same browser held before, when it is pairing again. It is signed out first, so re-pairing does not leave a second entry for one browser.","title":"Previous Session Id"},"supported_kinds":{"anyOf":[{"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":64,"type":"array"},{"type":"null"}],"description":"The step kinds this build can run, and the capabilities it has beyond them (such as profile_view:read_relationship). Nothing is handed to a browser that it cannot run. Leave it out (an older build) and the browser runs the kinds that existed before builds said.","title":"Supported Kinds"},"timezone":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"The browser's IANA timezone (Intl.DateTimeFormat().resolvedOptions().timeZone). It fills the sender's timezone when the sender has none: their daily limits reset at its midnight and sequences send in its hours. A timezone the sender has is never moved by it. Taken only from the browser driving the account.","title":"Timezone"},"vanity_name":{"default":"","maxLength":160,"title":"Vanity Name","type":"string"}},"required":["connection_token","member_urn"],"title":"AgentPairSchema","type":"object"},"AgentPromptContextRefSegment":{"description":"A reference to the org's business context, resolved per org.","properties":{"section":{"$ref":"#/components/schemas/AgentContextSection","default":"all"},"type":{"const":"context_ref","default":"context_ref","title":"Type","type":"string"}},"title":"AgentPromptContextRefSegment","type":"object"},"AgentPromptInputRefSegment":{"description":"A reference to one declared input, resolved per row at run time.","properties":{"input_id":{"format":"uuid","title":"Input Id","type":"string"},"type":{"const":"input_ref","default":"input_ref","title":"Type","type":"string"}},"required":["input_id"],"title":"AgentPromptInputRefSegment","type":"object"},"AgentPromptTemplate-Input":{"description":"A saved agent's prompt: literal text with references between the runs.\n\nThe same convention every other stored prompt in the product uses\n(``EnrichmentPromptTemplate`` for columns, template segments for\nsequences): identity-keyed segments, so renaming what a reference points\nat never rewrites the prompt. Structurally parallel to the enrichment\ntemplate rather than importing it: an agent prompt references INPUTS,\nan enrichment prompt references COLUMNS, and the import hierarchy keeps\nthe two domains apart.","properties":{"segments":{"items":{"discriminator":{"mapping":{"context_ref":"#/components/schemas/AgentPromptContextRefSegment","input_ref":"#/components/schemas/AgentPromptInputRefSegment","text":"#/components/schemas/AgentPromptTextSegment"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/AgentPromptTextSegment"},{"$ref":"#/components/schemas/AgentPromptInputRefSegment"},{"$ref":"#/components/schemas/AgentPromptContextRefSegment"}]},"maxItems":200,"title":"Segments","type":"array"}},"title":"AgentPromptTemplate","type":"object"},"AgentPromptTemplate-Output":{"description":"A saved agent's prompt: literal text with references between the runs.\n\nThe same convention every other stored prompt in the product uses\n(``EnrichmentPromptTemplate`` for columns, template segments for\nsequences): identity-keyed segments, so renaming what a reference points\nat never rewrites the prompt. Structurally parallel to the enrichment\ntemplate rather than importing it: an agent prompt references INPUTS,\nan enrichment prompt references COLUMNS, and the import hierarchy keeps\nthe two domains apart.","properties":{"segments":{"items":{"discriminator":{"mapping":{"context_ref":"#/components/schemas/AgentPromptContextRefSegment","input_ref":"#/components/schemas/AgentPromptInputRefSegment","text":"#/components/schemas/AgentPromptTextSegment"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/AgentPromptTextSegment"},{"$ref":"#/components/schemas/AgentPromptInputRefSegment"},{"$ref":"#/components/schemas/AgentPromptContextRefSegment"}]},"maxItems":200,"title":"Segments","type":"array"}},"title":"AgentPromptTemplate","type":"object"},"AgentPromptTextSegment":{"description":"A literal run of prompt text.","properties":{"text":{"maxLength":20000,"title":"Text","type":"string"},"type":{"const":"text","default":"text","title":"Type","type":"string"}},"required":["text"],"title":"AgentPromptTextSegment","type":"object"},"AgentReach":{"description":"How far a Use AI run may reach beyond the table's own data.\n\nThe price lever and the budget lever both key on this. ``NONE`` is one\nplain completion; ``MCP`` runs the research loop against ONLY the\norg's attached MCP tools (no web-read fees, no page summaries);\n``WEB`` is the full web research loop. A run that has both web and MCP\nexecutes (and bills) as ``WEB``.","enum":["none","mcp","web"],"title":"AgentReach","type":"string"},"AgentRejectSchema":{"properties":{"reason":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"title":"Reason"}},"title":"AgentRejectSchema","type":"object"},"AgentReleaseSchema":{"properties":{"claimed_at":{"description":"The step's claim, exactly as the claim handed it out.","format":"date-time","title":"Claimed At","type":"string"},"reason":{"$ref":"#/components/schemas/LinkedInReleaseReason","description":"verified_absent (looked, not done, may not finish it now) or reopen_paused (the person closed the tab again). Neither counts against the step: a run cut off under it is reported to the attempts endpoint."}},"required":["claimed_at","reason"],"title":"AgentReleaseSchema","type":"object"},"AgentResultSchema":{"description":"What a browser reports back about one action.\n\n``status`` is deliberately NOT the full ``LinkedInActionStatus``: that enum\nincludes ``queued`` and ``claimed``, which are the server's to write, and\n``rejected``, which arrives on its own endpoint because it costs neither\nbudget nor credit. An agent posting one of those used to be written\nstraight through, stamping a non-terminal status with a ``finished_at``.","properties":{"claimed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The claim this result is for, exactly as the claim handed it out. A housekeeping read whose claim lapsed goes back on the queue and can be claimed again; a result naming an earlier claim is refused as no longer claimed, unless it is a success for a step not settled since, or the same result again. Absent from older builds.","title":"Claimed At"},"diagnostic":{"anyOf":[{"$ref":"#/components/schemas/AgentDiagnosticSummarySchema"},{"type":"null"}],"description":"A page report's summary, when the browser decided from something it could not find. It never changes how the step settles. Unreadable summaries are dropped, never refused."},"duration_ms":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"error_code":{"anyOf":[{"$ref":"#/components/schemas/LinkedInAgentErrorCode"},{"type":"null"}]},"error_message":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Error Message"},"outcome":{"anyOf":[{"$ref":"#/components/schemas/LinkedInActionOutcome-Input"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/LinkedInAgentReportableStatus","description":"succeeded | failed | skipped: the terminal state the agent reached."}},"required":["status"],"title":"AgentResultSchema","type":"object"},"AgentRunningWaitSchema":{"description":"Where a browser's running step waits, reported to the team for a step that never ends.","properties":{"awake_seconds":{"description":"How long the innermost wait has run, the browser's sleep left out.","minimum":0.0,"title":"Awake Seconds","type":"integer"},"site":{"description":"The waits the step is inside, outermost first: 'step > navigate > tab.load'.","maxLength":200,"title":"Site","type":"string"},"tab_discarded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether Chrome discarded the tab.","title":"Tab Discarded"},"tab_frozen":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether Chrome froze the tab.","title":"Tab Frozen"},"tab_status":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"description":"The working tab's load status as Chrome gives it.","title":"Tab Status"}},"required":["site","awake_seconds"],"title":"AgentRunningWaitSchema","type":"object"},"AgentSendingReadSchema":{"properties":{"changed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this workspace's switch was last set; null if it never has been.","title":"Changed At"},"changed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Clerk user id of whoever last set this workspace's switch; null if nobody has.","title":"Changed By"},"paused":{"description":"True when this workspace has paused the replies the agent sends on its own. Replies it writes still wait in Needs approval for a person.","title":"Paused","type":"boolean"},"paused_everywhere":{"description":"True when Oneprofile has paused the agent's own sending for every workspace. Nothing is sent unattended while it is, whatever `paused` says.","title":"Paused Everywhere","type":"boolean"}},"required":["paused","paused_everywhere","changed_by","changed_at"],"title":"AgentSendingReadSchema","type":"object"},"AgentSendingUpdateSchema":{"properties":{"paused":{"description":"True pauses every reply the agent would send on its own; they wait for a person instead. False lets them send again (admins only).","title":"Paused","type":"boolean"},"reason":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"description":"Why, kept in the switch's history.","title":"Reason"}},"required":["paused"],"title":"AgentSendingUpdateSchema","type":"object"},"AgentSetStateSchema":{"properties":{"lease_nonce":{"anyOf":[{"maxLength":64,"minLength":8,"type":"string"},{"type":"null"}],"description":"This browser's lease identity. When given, lease_granted in the answer says whether this browser holds the lease; when absent it is always true.","title":"Lease Nonce"},"run_mode":{"anyOf":[{"$ref":"#/components/schemas/LinkedInApprovalMode"},{}],"description":"The sender's LinkedIn approval setting, as the side panel sets it: the same setting the sender's LinkedIn page sets. Absent leaves it untouched.","title":"Run Mode"}},"title":"AgentSetStateSchema","type":"object"},"AgentSettings":{"description":"Settings for the Agent web-research action.\n\n``starting_url_column_id`` binds a column whose per-row value seeds the\nresearch (stored by identity, like prompt references, so renames are safe\nand deletes are detectable). ``stay_on_domain`` confines every tool that\ntargets a site to that URL's domain and therefore requires a starting URL\nto scope to.\n\nThe two tool toggles are split by what a tool RETURNS, not by how many\ncalls it makes: ``allow_search`` governs discovery (web search and site\nmapping, which return URLs and snippets), ``allow_fetch`` governs content\nreads (scraping one page and crawling several).\n\n``use_row_context`` defaults ON, and a column stored before the field\nexisted decodes to that same default: an investigation whose subject is\nnamed in a column the prompt never mentions is the ordinary case, not the\nexception.\n\n``context`` is deliberately uncapped here. This shape is the run-time\nhandoff into the research loop, and by the time it is built the context\nis ASSEMBLED text: the column's own standing context with the org's\nbusiness context folded onto it. The length cap belongs on what an author\ntypes, and it lives there: on ``UseAISettings.context``, checked when the\ncolumn is saved. Re-checking the assembled string here failed every cell of\na column that was perfectly valid when saved, purely because the org had\nwritten a thorough business context.","properties":{"allow_fetch":{"default":true,"description":"Tool toggle: whether the agent may scrape pages and crawl sites.","title":"Allow Fetch","type":"boolean"},"allow_search":{"default":true,"description":"Tool toggle: whether the agent may search the web and map sites.","title":"Allow Search","type":"boolean"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"effort":{"$ref":"#/components/schemas/AgentEffortLevel","default":"standard"},"kind":{"const":"agent","default":"agent","title":"Kind","type":"string"},"saved_agent_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"An org-level saved agent this column's settings derive from.","title":"Saved Agent Id"},"starting_url_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A column whose per-row value is the research's starting URL.","title":"Starting Url Column Id"},"stay_on_domain":{"default":false,"description":"Whether site-targeting tools are confined to the starting URL's domain.","title":"Stay On Domain","type":"boolean"},"use_row_context":{"default":true,"description":"Whether the rest of this row's columns are folded in as context, on top of whatever the prompt itself references.","title":"Use Row Context","type":"boolean"}},"title":"AgentSettings","type":"object"},"AgentStateSchema":{"description":"The authoritative run state, returned on every heartbeat.\n\n``account_mismatch`` is the hard stop: the browser is signed in as somebody\nother than the account we are bound to, and acting would send this customer's\noutreach from the wrong identity.\n\n``run_mode`` is the sender's LinkedIn approval setting in force (manual for\na sender who never set one): the side panel shows it and can change it.\nApproval happens on Oneprofile's Tasks page before a step is queued, so a\nstep handed to the browser runs whichever it says.\n\n``queued_count`` counts steps waiting for a browser, not one running in one.","properties":{"account_mismatch":{"title":"Account Mismatch","type":"boolean"},"approvals_waiting":{"default":0,"description":"How many of this sender's LinkedIn steps wait for a person on Oneprofile's Tasks page, less those a paused sequence or paused contact holds; the side panel offers Approve tasks while any do.","title":"Approvals Waiting","type":"integer"},"attempts_enabled":{"default":false,"description":"Whether a build that reports attempts (attempts:v1) reports a run cut off without an error from LinkedIn to /actions/{id}/attempts/ and runs the step again only on the answer. The same switch as resume_enabled.","title":"Attempts Enabled","type":"boolean"},"checkpoint":{"title":"Checkpoint","type":"boolean"},"config_version":{"description":"The version of the selector and pacing config this server serves. A browser running any other version, older or newer, fetches the config again.","title":"Config Version","type":"integer"},"lease_granted":{"title":"Lease Granted","type":"boolean"},"lease_holder_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When lease_granted is false, what the browser holding the lease calls itself (for example 'Chrome on macOS'); null when that is not known.","title":"Lease Holder Label"},"poll_after_seconds":{"description":"How long to wait before the next check-in: the account's own time between steps, never more, and never so long the browser stops reading as active. At most 15 seconds while work is about to run (the time between steps is running out, a step may start now, or one is running with more behind it), so a missed wake-up costs seconds rather than a whole interval.","title":"Poll After Seconds","type":"integer"},"queued_count":{"title":"Queued Count","type":"integer"},"resume_enabled":{"default":false,"description":"Whether a build that resumes steps (resume:v1) may resume one that stopped without an error from LinkedIn. Off, a stopped step fails for a person to retry, as it did before; the grant and the saved results stay on either way.","title":"Resume Enabled","type":"boolean"},"run_mode":{"$ref":"#/components/schemas/LinkedInApprovalMode"},"running_claim":{"anyOf":[{"enum":["renewed","lost"],"type":"string"},{"type":"null"}],"description":"For a check-in that named a running step: renewed while that claim is still this browser's, lost once it is not (settled, rejected, lapsed while the browser was gone, or taken back from a step whose running_wait outlasted every ceiling), and the browser then stops the step before it changes anything more. Null for a check-in that named none.","title":"Running Claim"},"unpaced_waiting":{"default":false,"description":"A step that waits for no gap between steps (one the Oneprofile team fired to test the sender) could be handed out now: ask for it alone (unmetered_only) without waiting out this browser's own gap.","title":"Unpaced Waiting","type":"boolean"},"usage":{"default":[],"items":{"$ref":"#/components/schemas/LinkedInKindUsageReadSchema"},"title":"Usage","type":"array"},"usage_resets_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When today's counts in usage start over: 00:00 in the sender's timezone. Older servers leave it out, and a client then reads the next UTC midnight.","title":"Usage Resets At"},"wait":{"anyOf":[{"$ref":"#/components/schemas/LinkedInWaitReadSchema"},{"type":"null"}],"description":"What the next step is waiting on, and until when, as this browser sees it (another browser holding the lease reads as lease_held_elsewhere); null while nothing is queued."}},"required":["run_mode","checkpoint","lease_granted","account_mismatch","queued_count","poll_after_seconds","config_version"],"title":"AgentStateSchema","type":"object"},"AgentStepAction":{"description":"What one agent step did.\n\n``FETCH_PAGE`` is historical: the loop emits ``SCRAPE`` for the same act\ntoday, but stored step traces still carry the old value and must keep\ndeserializing, so the member stays.","enum":["search","fetch_page","map","scrape","crawl","mcp_tool","workspace_action","find_work_email","read_linkedin_profile","find_people_at_company","finish"],"title":"AgentStepAction","type":"string"},"AgentStepOutcome":{"description":"How one agent step ended: the structured half of its observation.","enum":["completed","failed","refused"],"title":"AgentStepOutcome","type":"string"},"AgentToolAvailabilitySchema":{"description":"Whether one agent tool can be switched on.","properties":{"available":{"description":"Whether the tool's supplier is available to this organisation; switching the tool on is refused otherwise.","title":"Available","type":"boolean"},"key":{"description":"The tool: 'find_work_email' or 'read_linkedin_profile'.","title":"Key","type":"string"}},"required":["key","available"],"title":"AgentToolAvailabilitySchema","type":"object"},"AgentVerificationSchema":{"description":"What to look for on LinkedIn before acting on a step that may already have happened.","properties":{"commit_granted_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a press was first granted; null when none was or an older build ran it.","title":"Commit Granted At"},"mode":{"$ref":"#/components/schemas/LinkedInLookMode","description":"verify_then_act: look first, finish it if it is not done. verify_only: look and report, never press (its sequence or contact was paused or stopped since it ran)."}},"required":["mode","commit_granted_at"],"title":"AgentVerificationSchema","type":"object"},"AiAppAccess":{"description":"What a person let one AI app do in their workspace when they connected it.\n\nChosen on the consent page. A workspace that is not on a paid plan reads\nas READ whatever was chosen, because making changes from an AI app is a\npaid entitlement; that is checked on every call, not stored here.","enum":["read","write"],"title":"AiAppAccess","type":"string"},"AiAppAnswerSchema":{"description":"Where to send the person once they have answered.","properties":{"redirect_url":{"title":"Redirect Url","type":"string"}},"required":["redirect_url"],"title":"AiAppAnswerSchema","type":"object"},"AiAppApproveSchema":{"description":"The person's yes: which workspace, and what the app may do there.","properties":{"access":{"$ref":"#/components/schemas/AiAppAccess"},"workspace_id":{"maxLength":255,"minLength":1,"title":"Workspace Id","type":"string"}},"required":["workspace_id","access"],"title":"AiAppApproveSchema","type":"object"},"AiAppBrand":{"description":"Whose mark the dashboard shows beside a connected app.","enum":["claude","chatgpt","other"],"title":"AiAppBrand","type":"string"},"AiAppListSchema":{"description":"The AI apps connected to the workspace, newest first.","properties":{"data":{"items":{"$ref":"#/components/schemas/AiAppReadSchema"},"title":"Data","type":"array"}},"required":["data"],"title":"AiAppListSchema","type":"object"},"AiAppReadSchema":{"description":"An AI app connected to the workspace.","properties":{"access":{"$ref":"#/components/schemas/AiAppAccess"},"app_name":{"title":"App Name","type":"string"},"brand":{"$ref":"#/components/schemas/AiAppBrand"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"last_used_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Used At"},"person_email":{"title":"Person Email","type":"string"},"person_name":{"description":"Their full name, or their email when they have none.","title":"Person Name","type":"string"},"redirect_host":{"title":"Redirect Host","type":"string"},"user_id":{"description":"The person who connected it.","title":"User Id","type":"string"}},"required":["id","app_name","brand","redirect_host","access","user_id","person_name","person_email","last_used_at","created_at"],"title":"AiAppReadSchema","type":"object"},"AiAppRequestReadSchema":{"description":"An AI app asking to connect, as the consent page shows it.","properties":{"app_name":{"description":"What to call the app.","title":"App Name","type":"string"},"brand":{"$ref":"#/components/schemas/AiAppBrand","description":"Whose mark to show beside the name."},"is_local":{"description":"Whether the app runs on this computer.","title":"Is Local","type":"boolean"},"recognised":{"description":"Whether the app is recognised by a host its maker controls; an unrecognised app is shown as unverified.","title":"Recognised","type":"boolean"},"redirect_host":{"description":"Where the person returns after answering.","title":"Redirect Host","type":"string"},"workspaces":{"items":{"$ref":"#/components/schemas/AiAppWorkspaceChoiceSchema"},"title":"Workspaces","type":"array"}},"required":["app_name","brand","recognised","is_local","redirect_host","workspaces"],"title":"AiAppRequestReadSchema","type":"object"},"AiAppWorkspaceChoiceSchema":{"description":"A workspace the person may connect the app to.","properties":{"can_write":{"description":"Whether an AI app may make changes in this workspace (a paid plan).","title":"Can Write","type":"boolean"},"name":{"title":"Name","type":"string"},"workspace_id":{"title":"Workspace Id","type":"string"}},"required":["workspace_id","name","can_write"],"title":"AiAppWorkspaceChoiceSchema","type":"object"},"AiConfidence":{"description":"How sure the model is. Shown on the card; no band sends without a person.","enum":["high","medium","low"],"title":"AiConfidence","type":"string"},"AiContextDocumentListSchema":{"description":"The org's reference documents, with the cap so the UI can show it.","properties":{"documents":{"items":{"$ref":"#/components/schemas/AiContextDocumentReadSchema"},"title":"Documents","type":"array"},"max_context_chars":{"description":"How many characters of included summaries one prompt reads, oldest document first. Documents past that line report `in_prompt_budget: false`.","title":"Max Context Chars","type":"integer"},"max_documents":{"description":"How many documents this workspace may keep.","title":"Max Documents","type":"integer"}},"required":["documents","max_documents","max_context_chars"],"title":"AiContextDocumentListSchema","type":"object"},"AiContextDocumentReadSchema":{"description":"One reference document: what it is, how far it got, and what prompts read.","properties":{"content_type":{"title":"Content Type","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"drive_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drive File Id"},"drive_web_view_link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Where to open the original in Google Drive, for linked documents.","title":"Drive Web View Link"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why the document could not be read, written for the reader.","title":"Error"},"filename":{"title":"Filename","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"in_prompt_budget":{"default":true,"description":"Whether this document's summary actually fits the prompt budget alongside the documents before it. Computed on the list; a single read reports true.","title":"In Prompt Budget","type":"boolean"},"included_in_context":{"description":"Whether this document's summary joins the business context.","title":"Included In Context","type":"boolean"},"size_bytes":{"title":"Size Bytes","type":"integer"},"source":{"$ref":"#/components/schemas/AiContextDocumentSource","description":"Whether the file was uploaded or linked from Google Drive."},"status":{"$ref":"#/components/schemas/AiContextDocumentStatus","description":"Poll the list while any document is still `processing`."},"steps":{"description":"What the last read did, one step per piece of work once it is done: the document read, the summary written. Grows while the document is `processing`; starts empty again when it is read again.","items":{"$ref":"#/components/schemas/AiStep"},"maxItems":40,"title":"Steps","type":"array"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The markdown summary that stands in for this document in AI prompts.","title":"Summary"},"summary_edited":{"description":"True once somebody saved over the written summary by hand.","title":"Summary Edited","type":"boolean"},"summary_generated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Summary Generated At"},"title":{"title":"Title","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","source","status","error","title","filename","content_type","size_bytes","summary","summary_edited","summary_generated_at","included_in_context","drive_file_id","drive_web_view_link","created_at","updated_at"],"title":"AiContextDocumentReadSchema","type":"object"},"AiContextDocumentSource":{"description":"Where a reference document came from.","enum":["upload","google_drive"],"title":"AiContextDocumentSource","type":"string"},"AiContextDocumentStatus":{"description":"How far a reference document has got through extraction and summarizing.\n\nUnlike a generation job, ``PENDING`` IS observed here: the row commits\nfirst and its workflow starts after that commit, so a reader can catch the\ngap. The two terminal states are absorbing.","enum":["pending","processing","ready","failed"],"title":"AiContextDocumentStatus","type":"string"},"AiContextDocumentUpdateSchema":{"description":"Request body for editing one document (tri-state PATCH semantics).","properties":{"included_in_context":{"anyOf":[{"type":"boolean"},{}],"description":"Whether this document's summary joins the business context.","title":"Included In Context"},"summary":{"anyOf":[{"maxLength":2000,"type":"string"},{},{"type":"null"}],"description":"New summary. Set to null to clear it. Saving one marks the summary as written by hand, so a later rewrite can warn before replacing it.","title":"Summary"},"title":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{}],"description":"New display name.","title":"Title"}},"title":"AiContextDocumentUpdateSchema","type":"object"},"AiContextDocumentsCreatedSchema":{"description":"The documents a Drive link created, in the order the files were picked.","properties":{"documents":{"items":{"$ref":"#/components/schemas/AiContextDocumentReadSchema"},"title":"Documents","type":"array"}},"required":["documents"],"title":"AiContextDocumentsCreatedSchema","type":"object"},"AiContextDriveLinkRequestSchema":{"description":"Request body for linking files picked in the Google Picker.","properties":{"file_ids":{"description":"Drive file ids from the Picker, in the order they were picked.","items":{"maxLength":255,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","type":"string"},"maxItems":25,"minItems":1,"title":"File Ids","type":"array"}},"required":["file_ids"],"title":"AiContextDriveLinkRequestSchema","type":"object"},"AiContextGenerateRequestSchema":{"description":"Request body for starting a generation from a company domain.","properties":{"domain":{"description":"A bare company domain like 'acme.com', with no scheme or path.","maxLength":255,"minLength":1,"title":"Domain","type":"string"}},"required":["domain"],"title":"AiContextGenerateRequestSchema","type":"object"},"AiContextGenerationJobReadSchema":{"description":"A generation job's current state. Poll this until `status` is terminal.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"domain":{"description":"The domain this job is researching.","title":"Domain","type":"string"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why generation failed: infra trouble, or too little public content.","title":"Error"},"id":{"format":"uuid","title":"Id","type":"string"},"status":{"$ref":"#/components/schemas/AiContextGenerationStatus"},"steps":{"description":"What the research did, one step per piece of work once it is done: the documents and pages it read, the sections it wrote. Grows while the job runs; kept once it finishes.","items":{"$ref":"#/components/schemas/AiStep"},"maxItems":40,"title":"Steps","type":"array"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","domain","status","error","created_at","updated_at"],"title":"AiContextGenerationJobReadSchema","type":"object"},"AiContextGenerationStatus":{"description":"Where a context-generation job has got to.\n\nJobs are born ``RUNNING``: creation validates, inserts and queues the\nworkflow in one call, so there is no separate committed-but-not-started\nphase. ``PENDING`` exists for schema parity with the other job enums and is\nnever observed. The two terminal states are absorbing: a job never leaves\nthem.","enum":["pending","running","succeeded","failed"],"title":"AiContextGenerationStatus","type":"string"},"AiContextReadSchema":{"description":"The org's business context, plus its latest generation job for resume.","properties":{"company_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Description"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"ideal_buyer_personas":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ideal Buyer Personas"},"ideal_customer_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ideal Customer Profile"},"interest_signals":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interest Signals"},"last_generated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Generated At"},"latest_generation_job":{"anyOf":[{"$ref":"#/components/schemas/AiContextGenerationJobReadSchema"},{"type":"null"}],"description":"The org's most recent generation job, if any. Lets a reloaded page resume polling a job that is still running."},"social_proof":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Social Proof"},"source_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The domain last used to generate these fields; null until a generation succeeds.","title":"Source Domain"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How the company words things: spelling, formality, what it calls its product and its buyers, jargon it avoids. The outbound agent matches it in every message.","title":"Voice"}},"required":["id","company_description","ideal_customer_profile","ideal_buyer_personas","interest_signals","social_proof","voice","source_domain","last_generated_at","latest_generation_job","created_at","updated_at"],"title":"AiContextReadSchema","type":"object"},"AiContextUpdateSchema":{"description":"Request body for editing the context fields (tri-state PATCH semantics).","properties":{"company_description":{"anyOf":[{"maxLength":10000,"type":"string"},{},{"type":"null"}],"description":"New value. Set to null to clear.","title":"Company Description"},"ideal_buyer_personas":{"anyOf":[{"maxLength":10000,"type":"string"},{},{"type":"null"}],"description":"New value. Set to null to clear.","title":"Ideal Buyer Personas"},"ideal_customer_profile":{"anyOf":[{"maxLength":10000,"type":"string"},{},{"type":"null"}],"description":"New value. Set to null to clear.","title":"Ideal Customer Profile"},"interest_signals":{"anyOf":[{"maxLength":10000,"type":"string"},{},{"type":"null"}],"description":"New value. Set to null to clear.","title":"Interest Signals"},"social_proof":{"anyOf":[{"maxLength":10000,"type":"string"},{},{"type":"null"}],"description":"New value. Set to null to clear.","title":"Social Proof"},"voice":{"anyOf":[{"maxLength":600,"type":"string"},{},{"type":"null"}],"description":"The company voice: spelling, formality, what the company calls its product and its buyers, jargon it avoids, how technical it gets. Not length or punctuation. Set to null to clear.","title":"Voice"}},"title":"AiContextUpdateSchema","type":"object"},"AiDraftReadSchema":{"properties":{"ask_reason":{"anyOf":[{"$ref":"#/components/schemas/AskReason"},{"type":"null"}],"description":"Why this reply is waiting for a person instead of going out on its own, for example `low_confidence`, `always_ask`, `unverified_sender`, `different_sender` or `daily_cap`. Null when nothing held it back, and on a reply a person asked for."},"body_text":{"title":"Body Text","type":"string"},"confidence":{"anyOf":[{"$ref":"#/components/schemas/AiConfidence"},{"type":"null"}]},"confidence_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence Reason"},"confidence_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The model's 0-100 calibration, clamped into the categorical band. Null for drafts that predate the field. Presentation only: every decision reads the categorical confidence.","title":"Confidence Score"},"generated_body_text":{"title":"Generated Body Text","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"outbound_message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The agent's message this reply came from, when a sequence's agent wrote it. Edits, ratings and the send are recorded against that message too, which is how the agent learns from them. Null on a reply written in the default voice for a conversation outside any sequence.","title":"Outbound Message Id"},"rating":{"anyOf":[{"$ref":"#/components/schemas/DraftRating"},{"type":"null"}],"description":"The human verdict on this draft, when one was given."},"send_after":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a `scheduled` reply goes out on its own, unless a person discards or edits it first. Kept once the reply is sending or sent. Null on a reply that was never scheduled, and on one taken off the schedule, by a person editing it or by a check that held it back for a person (see `ask_reason`).","title":"Send After"},"sent_by_kind":{"anyOf":[{"$ref":"#/components/schemas/MessageSentByKind"},{"type":"null"}],"description":"Who sent the reply: `person` when someone approved it, `system` when the agent sent it on its own. Null until it is sent."},"source":{"$ref":"#/components/schemas/AiDraftSource"},"status":{"$ref":"#/components/schemas/AiDraftStatus","description":"Where this reply stands. `pending_approval`: waiting for a person to approve, edit or discard it. `scheduled`: the agent will send it on its own at `send_after` unless a person discards or edits it first. `sending`: it is leaving now and can no longer be changed. `send_unknown`: it was sent, but the mailbox has not confirmed it yet; it settles on its own as `sent` or `send_failed`. `send_failed`: it did not go; write a fresh reply. `sent`: it went out. `discarded`: a person rejected it or asked for a new version. `stale`: the contact wrote again before anyone answered it."},"steer_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steer Text"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"thread_id":{"format":"uuid","title":"Thread Id","type":"string"}},"required":["id","thread_id","status","source","steer_text","subject","body_text","generated_body_text","confidence","confidence_reason"],"title":"AiDraftReadSchema","type":"object"},"AiDraftSource":{"enum":["auto_drafted","on_demand"],"title":"AiDraftSource","type":"string"},"AiDraftStatus":{"description":"Where one drafted reply stands.\n\nSTALE is its own terminal state rather than a flavour of DISCARDED: \"the\nprospect wrote again before anyone answered\" and \"a human said no\" are\ndifferent facts, and only the second one says anything about draft quality.\n\nThe send states past SCHEDULED exist for the same reason SEND_UNKNOWN does:\nonce a draft can leave without a person watching, \"we do not know\" has to be\na state of its own. Collapsing it into SEND_FAILED would have a retry send\nthe same reply twice; collapsing it into SENT would lose a reply silently.","enum":["pending_approval","sent","discarded","stale","scheduled","sending","send_unknown","send_failed"],"title":"AiDraftStatus","type":"string"},"AiReplyMode":{"description":"How far the AI reply layer may go on this sequence.\n\nOFF is the default everywhere: a workspace\nopts in. DRAFT_AND_QUEUE is as far as it goes: every draft waits in Needs\napproval for a person, whatever its confidence. There is deliberately no\nmode past it. A self-sending auto-pilot shipped once and was removed\nunder the ruling that a send cannot be taken back, so nothing may send\nwith nobody present; rows that carried it were moved to DRAFT_AND_QUEUE\nby the ``retire_auto_send_reply_mode`` release task. A SENT draft with no\napprover is therefore always history from before that ruling.","enum":["off","draft_and_queue"],"title":"AiReplyMode","type":"string"},"AiSettingsReadSchema":{"description":"The workspace's AI defaults. The auto-label switch lives here.","properties":{"agent_replies_enabled":{"description":"The workspace switch for replies the agent writes and may send on its own. Off, the agent writes no replies and nothing is sent without a person; Draft with AI in the inbox still works.","title":"Agent Replies Enabled","type":"boolean"},"ai_disclosure_line":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A line added below every email reply the agent sends on its own, for rules that require saying a message was written with AI. Never added to a reply a person approved. Null adds nothing.","title":"Ai Disclosure Line"},"default_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Language"},"default_reply_mode":{"$ref":"#/components/schemas/AiReplyMode"},"default_tone":{"$ref":"#/components/schemas/AiTone"},"labelling_enabled":{"title":"Labelling Enabled","type":"boolean"}},"required":["default_reply_mode","default_language","default_tone","labelling_enabled","agent_replies_enabled","ai_disclosure_line"],"title":"AiSettingsReadSchema","type":"object"},"AiSettingsUpdateSchema":{"description":"Partial update: only the fields present in the request are written.","properties":{"agent_replies_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"The workspace switch for replies the agent writes and may send on its own. Off, the agent writes no replies and nothing is sent without a person; Draft with AI in the inbox still works. Leave out to keep it as it is.","title":"Agent Replies Enabled"},"ai_disclosure_line":{"anyOf":[{"maxLength":300,"minLength":1,"type":"string"},{"type":"null"}],"description":"A line added below every email reply the agent sends on its own, for rules that require saying a message was written with AI. Never added to a reply a person approved. Up to 300 characters. Send null to stop adding one; leave out to keep it as it is.","title":"Ai Disclosure Line"},"default_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Language"},"default_reply_mode":{"anyOf":[{"$ref":"#/components/schemas/AiReplyMode"},{"type":"null"}]},"default_tone":{"anyOf":[{"$ref":"#/components/schemas/AiTone"},{"type":"null"}]},"labelling_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Labelling Enabled"}},"title":"AiSettingsUpdateSchema","type":"object"},"AiStep":{"additionalProperties":false,"description":"One thing an AI turn did, as the wire spells it.\n\nField-for-field identical to ``table_live_updates.TableCellActivityStepSchema``\nON PURPOSE, and the duplication is the design. That schema sits in the table\nstratum's kernel, which the lead search, inbox and sequence surfaces have no\nbusiness importing; this one sits under every surface equally. Because the\ntwo agree exactly, the frontend's ``TimelineStep`` renders both with no\nconversion and no second component, which is the property worth protecting.\n``test_ai_step_mirrors_the_cell_activity_step`` pins them together.\n\nPlain strings rather than enums, for the same reason the cell schema uses\nthem: the vocabulary is open, clients must tolerate tokens they have not\nlearned yet, and a new action should never be able to break a running\ndashboard.","properties":{"action":{"description":"What kind of move this was, e.g. `read_table`, `plan`, `write_column`.","title":"Action","type":"string"},"detail":{"default":"","description":"The step's input: the instruction, the column it read, the query it ran.","title":"Detail","type":"string"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Wall clock for the work this step describes, never an estimate.","title":"Duration Ms"},"observation":{"default":"","description":"One line on what came back. The half that makes a step worth reading.","maxLength":500,"title":"Observation","type":"string"},"outcome":{"default":"completed","description":"`completed`, `failed`, `refused` or `stopped`. Clients must tolerate new tokens.","title":"Outcome","type":"string"},"thought":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The model's stated reasoning for choosing this step. Set by the agent loop; the assistant surfaces leave it null, and the renderer simply omits the rung.","title":"Thought"}},"required":["action"],"title":"AiStep","type":"object"},"AiTone":{"description":"How a generated reply should read.","enum":["professional","friendly","direct","casual"],"title":"AiTone","type":"string"},"AnalyticsPointReadSchema":{"properties":{"connection_requests":{"default":0,"title":"Connection Requests","type":"integer"},"day":{"format":"date-time","title":"Day","type":"string"},"linkedin_actions":{"default":0,"title":"Linkedin Actions","type":"integer"},"linkedin_messages":{"default":0,"title":"Linkedin Messages","type":"integer"},"replied":{"title":"Replied","type":"integer"},"sent":{"title":"Sent","type":"integer"}},"required":["day","sent","replied"],"title":"AnalyticsPointReadSchema","type":"object"},"AppListingCallbackRequestSchema":{"description":"The OAuth callback parameters posted by the frontend callback page.","properties":{"code":{"maxLength":2048,"minLength":1,"title":"Code","type":"string"},"params":{"additionalProperties":{"maxLength":2048,"type":"string"},"description":"Extra provider callback query parameters forwarded by the callback page, used to auto-detect the data center where the vendor returns it (e.g. Zoho `location`).","propertyNames":{"maxLength":255,"minLength":1},"title":"Params","type":"object"},"state":{"maxLength":512,"minLength":1,"title":"State","type":"string"}},"required":["code","state"],"title":"AppListingCallbackRequestSchema","type":"object"},"AppListingCallbackResponseSchema":{"description":"A pending-connection id.\n\nThe user finalizes it by calling the create endpoint (``POST /integration/{type}/``) with this\n``connection_id``. The OAuth-connect flow shares the regular create/preview endpoints.","properties":{"connection_id":{"title":"Connection Id","type":"string"}},"required":["connection_id"],"title":"AppListingCallbackResponseSchema","type":"object"},"AppListingClaimOntoExistingResponseSchema":{"description":"The integration a switch/reconnect re-authorized in place.","properties":{"integration_id":{"description":"The existing integration, now re-authorized (same id, now one-click).","format":"uuid","title":"Integration Id","type":"string"}},"required":["integration_id"],"title":"AppListingClaimOntoExistingResponseSchema","type":"object"},"AppListingConnectInputsResponseSchema":{"description":"The connect-time inputs an app listing collects before the OAuth redirect.","properties":{"inputs":{"description":"Empty for listings that connect in one click (no per-customer inputs).","items":{"$ref":"#/components/schemas/ConnectInputSchema"},"title":"Inputs","type":"array"}},"required":["inputs"],"title":"AppListingConnectInputsResponseSchema","type":"object"},"AppListingConnectionConfigResponseSchema":{"description":"The engine-captured connect-time config for a pending connection.","properties":{"config":{"additionalProperties":{"maxLength":2048,"type":"string"},"description":"The tenant/region/login config the engine captured at connect time (e.g. Salesforce `login_url`), for the create wizard to show read-only. Empty for one-click listings.","title":"Config","type":"object"}},"title":"AppListingConnectionConfigResponseSchema","type":"object"},"AppListingInstallRequestSchema":{"description":"Request to begin an app listing OAuth install.","properties":{"inputs":{"additionalProperties":{"maxLength":2048,"minLength":1,"type":"string"},"description":"Connect-time inputs collected before the redirect (tenant address, region, or a choice), keyed by input name. Empty for listings that need no inputs.","propertyNames":{"maxLength":255,"minLength":1},"title":"Inputs","type":"object"},"integration_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"For switch/reconnect only: the existing integration to re-authorize in place. Bound into the OAuth state so the claim mutates only this integration. Omit for new connects.","title":"Integration Id"},"intent":{"anyOf":[{"$ref":"#/components/schemas/SwitchIntent"},{"type":"null"}],"description":"For switch/reconnect only: 'switch' (API-key -> one-click) or 'reconnect' (re-authorize). Must be set together with integration_id."},"slug":{"maxLength":255,"minLength":1,"title":"Slug","type":"string"}},"required":["slug"],"title":"AppListingInstallRequestSchema","type":"object"},"AppListingInstallResponseSchema":{"description":"The provider authorize URL to redirect the user to.","properties":{"authorize_url":{"title":"Authorize Url","type":"string"}},"required":["authorize_url"],"title":"AppListingInstallResponseSchema","type":"object"},"AppListingPreflightRequestSchema":{"description":"Request to check whether a customer's hand-typed workspace resolves before the redirect.","properties":{"inputs":{"additionalProperties":{"maxLength":2048,"minLength":1,"type":"string"},"description":"Connect-time inputs to resolve-check, keyed by input name.","propertyNames":{"maxLength":255,"minLength":1},"title":"Inputs","type":"object"},"slug":{"maxLength":255,"minLength":1,"title":"Slug","type":"string"}},"required":["slug"],"title":"AppListingPreflightRequestSchema","type":"object"},"AppListingPreflightResponseSchema":{"description":"The pre-flight resolve-check outcome.","properties":{"status":{"$ref":"#/components/schemas/PreflightStatus","description":"found (safe to redirect), not_found (keep the customer on the form), or unreachable (the customer may proceed with a soft warning)."}},"required":["status"],"title":"AppListingPreflightResponseSchema","type":"object"},"ApprovalLevel":{"description":"Which level an effective mode came from, so the UI can say \"inherited from\" what.\n\n``DEFAULT`` is the product's own answer for a sender that has never been\nset: manual for LinkedIn, automatic for email. There is no workspace\nlevel: a sender that had one would be governed by two settings pages at\nonce, and the one a rep actually looks at is the sender's.","enum":["default","sender","sequence"],"title":"ApprovalLevel","type":"string"},"ApprovalMode":{"description":"Whether a channel's steps wait for a person or run on their own.\n\nThe values mirror the sender's own settings exactly (``mailbox``'s\n``LinkedInApprovalMode`` and ``EmailApprovalMode``): a sender's setting IS\nits sender-level override, and the strings cross over without a\ntranslation table between them.","enum":["manual","auto"],"title":"ApprovalMode","type":"string"},"ApprovalScope":{"enum":["once","thread","project_me","project_all"],"type":"string"},"ApproveDraftSchema":{"description":"What the person's composer shows under the draft's words when they approve it.","properties":{"signature_block":{"anyOf":[{"maxLength":4000,"type":"string"},{"type":"null"}],"description":"The divider and signature exactly as the composer shows them under the draft's words, empty when the person removed them. Sent under the words in place of the mailbox's own signature, so the email is what they saw. Null signs as the mailbox does.","title":"Signature Block"}},"title":"ApproveDraftSchema","type":"object"},"ArchivedScope":{"description":"Which tables a listing reaches, as far as the archive goes.","enum":["exclude","include","only"],"title":"ArchivedScope","type":"string"},"AskReason":{"description":"Why a message that could have sent unattended was put in front of a person.\n\nOne vocabulary for every gate between an agent writing a message and the\nmessage leaving: what the agent itself said about the draft\n(``LOW_CONFIDENCE``, ``FINDINGS``, ``INSUFFICIENT_DATA``, ``POLICY``), what\nthe sender or the cadence asked for (``ALWAYS_ASK``, ``SEQUENCE_MANUAL``,\n``STEP_REQUIRES_APPROVAL``), what the pacing rules refused\n(``DAILY_CAP``, ``CONSECUTIVE_CAP``, ``THREAD_CAP``, ``HOURLY_CAP``,\n``ORG_DAILY_CAP``), what the mailbox or the thread made unsafe\n(``UNVERIFIED_SENDER``, ``DIFFERENT_SENDER``, ``LABEL``, ``QUESTION``,\n``STALE_INBOUND``, ``SEQUENCE_GONE``), and what the counterparty turned out to be\n(``BOT_QUESTION``, ``AUTOMATED_COUNTERPARTY``, ``AUTHENTICATION``,\n``LANGUAGE``, ``LINKEDIN_ONLY``). ``KILL_SWITCH`` is the platform switch\nthat stops unattended sending outright, and ``SEND_INTERRUPTED`` an\nunattended reply whose send never got as far as a provider.\n``SENDER_SWITCHED_TO_MANUAL`` is a LinkedIn step queued unasked that went\nback to a person because its sender switched to manual before it ran.\n\nStored on the task so the queue can say why each row is there, and so\n\"why did nothing send\" is answerable by counting rows rather than by\nreading logs.","enum":["low_confidence","findings","insufficient_data","policy","always_ask","sequence_manual","step_requires_approval","daily_cap","unverified_sender","suppressed","different_sender","label","question","consecutive_cap","thread_cap","hourly_cap","org_daily_cap","stale_inbound","sequence_gone","bot_question","automated_counterparty","kill_switch","authentication","language","linkedin_only","send_interrupted","sender_switched_to_manual"],"title":"AskReason","type":"string"},"AssignedSenderSendModeReadSchema":{"description":"One sender assigned to a sequence, and how much of their email sends without a person.","properties":{"email_send_mode":{"$ref":"#/components/schemas/SenderSendMode","description":"This sender's own send mode, tightened to `always_ask` when the sequence asks for approval. It decides the agent's replies from their mailboxes in this sequence's conversations. The sequence's own emails run under `cadence_email_send_mode` whichever assigned sender's mailbox they leave from, so they can be held where this mode alone would send. `always_send` sends every email unless a check finds a problem in an agent-written one; `send_when_confident` also holds back the agent-written emails the agent is not confident in; `always_ask` has a person approve every email."},"sender_profile_id":{"format":"uuid","title":"Sender Profile Id","type":"string"},"sender_profile_name":{"description":"The sender as the Senders page names them.","title":"Sender Profile Name","type":"string"}},"required":["sender_profile_id","sender_profile_name","email_send_mode"],"title":"AssignedSenderSendModeReadSchema","type":"object"},"AssistantAppliedContextSchema":{"description":"Context for a change the AI Assistant made through a granted workspace action.","properties":{"column_display_name":{"default":"","title":"Column Display Name","type":"string"},"proposal_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Proposal Id"},"summary":{"default":"","title":"Summary","type":"string"},"type":{"const":"assistant_applied","default":"assistant_applied","title":"Type","type":"string"},"verb":{"default":"","title":"Verb","type":"string"}},"title":"AssistantAppliedContextSchema","type":"object"},"AssistantErrorReason":{"description":"Why a turn could not run, for a client choosing what to show instead.\n\nEvery reason an ``error`` frame of the table assistant, the agent builder\nor the campaign drafter can carry lives here, so that a route builds the\nframe from the enum rather than spelling the wire value out: a value the\nenum names but no route sends is a promise to the client that nothing\nkeeps, and a value a route sends but the enum lacks is one the generated\nclient cannot narrow on.","enum":["limit","paused","stopped","not_found","locked","ai_unavailable"],"title":"AssistantErrorReason","type":"string"},"AssistantPromptCreateSchema":{"description":"Save one prompt for this workspace to use again.","properties":{"body":{"description":"The message the card will put in the composer.","maxLength":2000,"minLength":1,"title":"Body","type":"string"},"title":{"anyOf":[{"maxLength":60,"minLength":1,"type":"string"},{"type":"null"}],"description":"What to call the card. Left out, a name is taken from the prompt's own first sentence, which is what saving a message you already sent does.","title":"Title"}},"required":["body"],"title":"AssistantPromptCreateSchema","type":"object"},"AssistantPromptListSchema":{"description":"Every prompt this workspace is offered, built-in ones first.","properties":{"prompts":{"items":{"$ref":"#/components/schemas/AssistantPromptReadSchema"},"title":"Prompts","type":"array"}},"required":["prompts"],"title":"AssistantPromptListSchema","type":"object"},"AssistantPromptReadSchema":{"description":"One prompt offered under the assistant's composer.","properties":{"body":{"description":"The message pressing the card puts in the composer.","title":"Body","type":"string"},"built_in":{"description":"Whether we wrote it. A built-in cannot be edited or deleted.","title":"Built In","type":"boolean"},"created_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created At"},"id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Null for a built-in prompt, which is defined in our code rather than saved.","title":"Id"},"key":{"description":"Stable identifier for this card across both kinds: the built-in's key, or the saved prompt's id.","title":"Key","type":"string"},"title":{"description":"What the card is called.","title":"Title","type":"string"},"updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Updated At"}},"required":["key","title","body","built_in"],"title":"AssistantPromptReadSchema","type":"object"},"AssistantPromptUpdateSchema":{"description":"Rewrite one of this workspace's own prompts.","properties":{"body":{"description":"The message pressing the card puts in the composer.","maxLength":2000,"minLength":1,"title":"Body","type":"string"},"title":{"description":"What the card is called.","maxLength":60,"minLength":1,"title":"Title","type":"string"}},"required":["title","body"],"title":"AssistantPromptUpdateSchema","type":"object"},"AssistantSettingsReadSchema":{"description":"What the assistant may apply unasked in this workspace.","properties":{"approval_threshold_credits":{"description":"Whole credits. Anything priced at or above this always proposes, whatever was granted.","title":"Approval Threshold Credits","type":"integer"},"default_granted_tools":{"description":"The write operations the assistant may call without asking, for everybody in this workspace. Operation names, as `GET /assistant/tools/` lists them.","items":{"type":"string"},"title":"Default Granted Tools","type":"array"},"default_granted_verbs":{"description":"The verbs a new conversation may apply without asking.","items":{"$ref":"#/components/schemas/WorkspaceVerb"},"title":"Default Granted Verbs","type":"array"}},"required":["approval_threshold_credits","default_granted_verbs","default_granted_tools"],"title":"AssistantSettingsReadSchema","type":"object"},"AssistantSettingsUpdateSchema":{"description":"Change the threshold, the default grants, or both; a field left out keeps its value.","properties":{"approval_threshold_credits":{"anyOf":[{"maximum":100000.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Approval Threshold Credits"},"default_granted_tools":{"anyOf":[{"items":{"type":"string"},"maxItems":200,"type":"array"},{"type":"null"}],"description":"The write operations everybody in this workspace may have the assistant call without asking. Send the current list minus one to take it back.","title":"Default Granted Tools"},"default_granted_verbs":{"anyOf":[{"items":{"$ref":"#/components/schemas/WorkspaceVerb"},"maxItems":8,"type":"array"},{"type":"null"}],"title":"Default Granted Verbs"}},"title":"AssistantSettingsUpdateSchema","type":"object"},"AssistantStreamErrorSchema":{"description":"The data of a reasoned SSE ``error`` frame, and the ``detail`` of a 429.\n\n``reason`` says why the turn did not run: ``limit`` (the workspace's daily\nallowance is spent) or ``paused`` (every AI Assistant is switched off) on\nevery surface; ``stopped`` when a stateless generation was stopped by the\ncaller; ``not_found`` and ``locked`` when the campaign drafter's stream\nreports what its plain route answers 404 and 423 to; ``ai_unavailable``\nwhen the model behind the agent cannot be asked at all. A 429 only ever\ncarries the first two. Shared by every assistant surface that spends the\nallowance, so one client component can read every refusal the same way.","properties":{"detail":{"title":"Detail","type":"string"},"reason":{"$ref":"#/components/schemas/AssistantErrorReason"}},"required":["detail","reason"],"title":"AssistantStreamErrorSchema","type":"object"},"AssistantThreadLinkResponseSchema":{"description":"The link as recorded, both ends.","properties":{"continued_from":{"$ref":"#/components/schemas/AssistantThreadRefSchema"},"continued_in":{"$ref":"#/components/schemas/AssistantThreadRefSchema"}},"required":["continued_from","continued_in"],"title":"AssistantThreadLinkResponseSchema","type":"object"},"AssistantThreadLinkSchema":{"description":"Record that this thread continues in another: a search, and the table it produced.","properties":{"continued_in":{"$ref":"#/components/schemas/AssistantThreadRefSchema"}},"required":["continued_in"],"title":"AssistantThreadLinkSchema","type":"object"},"AssistantThreadListResponseSchema":{"description":"One page of a person's threads, pinned first, then newest activity first.","properties":{"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Send as `cursor` for the page after this one; null on the last page.","title":"Next Cursor"},"threads":{"items":{"$ref":"#/components/schemas/AssistantThreadReadSchema"},"title":"Threads","type":"array"}},"required":["threads","next_cursor"],"title":"AssistantThreadListResponseSchema","type":"object"},"AssistantThreadReadSchema":{"description":"One thread in the list, from whichever assistant it belongs to.","properties":{"continued_from":{"anyOf":[{"$ref":"#/components/schemas/AssistantThreadRefSchema"},{"type":"null"}],"description":"The thread this one continues: the search that produced this table."},"continued_in":{"anyOf":[{"$ref":"#/components/schemas/AssistantThreadRefSchema"},{"type":"null"}],"description":"The thread this one continues in: the table this search produced."},"created_at":{"format":"date-time","title":"Created At","type":"string"},"last_message_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Message At"},"open_path":{"description":"Where the dashboard navigates to reopen the thread: its chat.","title":"Open Path","type":"string"},"origin":{"$ref":"#/components/schemas/ThreadOrigin"},"origin_ref_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The table or saved agent the thread is bound to; null for a lead search or the general chat.","title":"Origin Ref Id"},"origin_ref_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"That table's or agent's name, or what a lead search was for; null when the thread is bound to nothing, or its agent is gone.","title":"Origin Ref Label"},"pinned":{"title":"Pinned","type":"boolean"},"shared":{"description":"A legacy table thread nobody is recorded as starting, which the whole workspace sees and may rename, pin or delete.","title":"Shared","type":"boolean"},"thread_id":{"format":"uuid","title":"Thread Id","type":"string"},"title":{"title":"Title","type":"string"}},"required":["origin","thread_id","title","last_message_at","created_at","pinned","shared","origin_ref_id","origin_ref_label","continued_from","continued_in","open_path"],"title":"AssistantThreadReadSchema","type":"object"},"AssistantThreadRefSchema":{"description":"One thread, named by its store and its id in that store.","properties":{"origin":{"$ref":"#/components/schemas/ThreadOrigin"},"thread_id":{"format":"uuid","title":"Thread Id","type":"string"}},"required":["origin","thread_id"],"title":"AssistantThreadRefSchema","type":"object"},"AssistantThreadUpdateSchema":{"description":"Rename a thread, pin or unpin it, or both. A field left out is left alone.","properties":{"pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True pins the thread to the top; false unpins.","title":"Pinned"},"title":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"The new title. Kept beside the store's own title rather than written into it, so the store keeps naming the thread after its first message and this is what the list shows instead.","title":"Title"}},"title":"AssistantThreadUpdateSchema","type":"object"},"AssistantUnavailableResponseSchema":{"description":"A refused turn: the sentence to show, and why.","properties":{"detail":{"$ref":"#/components/schemas/AssistantStreamErrorSchema"}},"required":["detail"],"title":"AssistantUnavailableResponseSchema","type":"object"},"AssistantUndoneContextSchema":{"description":"Context for the reversal of an assistant's change to the table.\n\nHistory only: undo was taken out of the assistant and nothing writes\nthis any more. It stays so trails written before that still read back.","properties":{"proposal_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Proposal Id"},"summary":{"default":"","title":"Summary","type":"string"},"type":{"const":"assistant_undone","default":"assistant_undone","title":"Type","type":"string"},"verb":{"default":"","title":"Verb","type":"string"}},"title":"AssistantUndoneContextSchema","type":"object"},"AttachLeadSearchRequestSchema":{"description":"The body for appending a search's results to an existing table.","properties":{"backlinks":{"anyOf":[{"$ref":"#/components/schemas/BacklinksQuerySchema"},{"type":"null"}]},"companies":{"anyOf":[{"$ref":"#/components/schemas/CompanyQuerySchema"},{"type":"null"}]},"enrichments":{"description":"What to find out about the rows this adds. Each becomes its own column, and each is billed per row that comes back with an answer.","items":{"$ref":"#/components/schemas/LeadEnrichmentOption"},"maxItems":4,"title":"Enrichments","type":"array"},"hiring_companies":{"anyOf":[{"$ref":"#/components/schemas/HiringCompaniesQuerySchema"},{"type":"null"}]},"include_people_already_in_tables":{"default":false,"description":"A people search only. By default it leaves out the people who already have a row in one of the workspace's other tables, and keeps looking until enough new people are added; the response says how many it skipped. Set true to add them again.","title":"Include People Already In Tables","type":"boolean"},"local_businesses":{"anyOf":[{"$ref":"#/components/schemas/LocalBusinessQuerySchema"},{"type":"null"}]},"lookalikes":{"anyOf":[{"$ref":"#/components/schemas/LookalikeQuerySchema"},{"type":"null"}]},"people":{"anyOf":[{"$ref":"#/components/schemas/PeopleQuerySchema"},{"type":"null"}]},"post_authors":{"anyOf":[{"$ref":"#/components/schemas/PostAuthorsQuerySchema"},{"type":"null"}]},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"row_limit":{"anyOf":[{"maximum":1000000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Rows to add. Clamped further by the organisation's plan cap; omit for the maximum.","title":"Row Limit"},"search_results":{"anyOf":[{"$ref":"#/components/schemas/SearchResultsQuerySchema"},{"type":"null"}]},"signal_companies":{"anyOf":[{"$ref":"#/components/schemas/SignalCompaniesQuerySchema"},{"type":"null"}]},"signal_people":{"anyOf":[{"$ref":"#/components/schemas/SignalPeopleQuerySchema"},{"type":"null"}]}},"required":["record_type"],"title":"AttachLeadSearchRequestSchema","type":"object"},"AttachmentReadSchema":{"properties":{"content_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The file's Content-ID, without its angle brackets, or null when it has none. The message's HTML names an image shown inside it as cid:<content_id>, but mail clients set a Content-ID on ordinary attachments too, so one alone does not mean the file is shown inside the message: only the HTML naming it does.","title":"Content Id"},"content_type":{"title":"Content Type","type":"string"},"filename":{"title":"Filename","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"size_bytes":{"title":"Size Bytes","type":"integer"}},"required":["id","filename","content_type","size_bytes"],"title":"AttachmentReadSchema","type":"object"},"AudienceDiffReadSchema":{"description":"What an audience change does to who is in progress: pending, active, waiting or paused.","properties":{"added":{"description":"Contacts in progress after the change who are not now: new contacts, contacts back where they left off, and when starting fresh everyone who starts at step one. When the counts are capped, the new contacts are only the rows read: at least this many.","title":"Added","type":"integer"},"not_changed":{"description":"Every other contact already in the sequence. Exact.","title":"Not Changed","type":"integer"},"pauses_sending":{"description":"Applying it pauses a running sequence first. A filter change never does.","title":"Pauses Sending","type":"boolean"},"removed":{"description":"Contacts in progress now who stop, reading Left the audience. Exact at any table size.","title":"Removed","type":"integer"}},"required":["added","removed","not_changed","pauses_sending"],"title":"AudienceDiffReadSchema","type":"object"},"AudienceEligibilityContactReadSchema":{"properties":{"enrolment_id":{"format":"uuid","title":"Enrolment Id","type":"string"},"name":{"title":"Name","type":"string"},"processing":{"title":"Processing","type":"boolean"},"reachable":{"title":"Reachable","type":"boolean"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"required":["enrolment_id","name","reachable","reason","processing"],"title":"AudienceEligibilityContactReadSchema","type":"object"},"AudienceEligibilityReadSchema":{"properties":{"added":{"title":"Added","type":"integer"},"blocked":{"title":"Blocked","type":"integer"},"capped":{"title":"Capped","type":"boolean"},"checked":{"title":"Checked","type":"integer"},"contacts":{"items":{"$ref":"#/components/schemas/AudienceEligibilityContactReadSchema"},"title":"Contacts","type":"array"},"groups":{"$ref":"#/components/schemas/ContactGroupCountsReadSchema","description":"The Audience tab's tabs and their counts. Every contact sits under exactly one, and list_sequence_contacts' 'group' lists one tab."},"processing":{"title":"Processing","type":"integer"},"reachable":{"title":"Reachable","type":"integer"},"reasons":{"additionalProperties":{"type":"integer"},"title":"Reasons","type":"object"}},"required":["added","checked","reachable","blocked","processing","capped","reasons","contacts","groups"],"title":"AudienceEligibilityReadSchema","type":"object"},"AudiencePreviewReadSchema":{"properties":{"already_enrolled":{"title":"Already Enrolled","type":"integer"},"capped":{"title":"Capped","type":"boolean"},"email_not_deliverable":{"default":0,"description":"Rows with an email whose deliverability verdict is not one the sequence emails, so their email steps are skipped. Zero with no deliverability column mapped, or a cadence that sends no email.","title":"Email Not Deliverable","type":"integer"},"email_unchecked":{"default":0,"description":"Rows with an email the deliverability column has not verified yet; their email steps wait for the verdict.","title":"Email Unchecked","type":"integer"},"enrollable":{"title":"Enrollable","type":"integer"},"in_cooldown":{"default":0,"description":"Refused by the workspace's cooldown: somebody else reached them inside the window, so enrolling them would contact them during it.","title":"In Cooldown","type":"integer"},"in_other_sequence":{"default":0,"description":"Held by another live sequence right now, so a launch skips them. Counted before already_enrolled: enrollable plus already_enrolled is who this sequence would actually write to.","title":"In Other Sequence","type":"integer"},"missing_email":{"title":"Missing Email","type":"integer"},"suppressed":{"title":"Suppressed","type":"integer"},"total_rows":{"title":"Total Rows","type":"integer"},"with_company_domain":{"default":0,"description":"Rows of total_rows carrying a mapped company domain.","title":"With Company Domain","type":"integer"},"with_email":{"default":0,"description":"Rows of total_rows carrying a value in the mapped email column.","title":"With Email","type":"integer"},"with_linkedin_url":{"default":0,"description":"Rows of total_rows carrying a mapped LinkedIn profile URL.","title":"With Linkedin Url","type":"integer"}},"required":["total_rows","enrollable","missing_email","suppressed","already_enrolled","capped"],"title":"AudiencePreviewReadSchema","type":"object"},"AudiencePutSchema":{"properties":{"column_mapping":{"$ref":"#/components/schemas/ColumnMappingSchema","description":"Omit it. An empty mapping means the columns are detected from the table, which is what the dashboard sends."},"existing_contacts":{"default":"keep","enum":["keep","restart"],"title":"Existing Contacts","type":"string"},"expected_updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Expected Updated At"},"pause_if_running":{"default":false,"title":"Pause If Running","type":"boolean"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A saved view narrowing the audience to its rows; null is the whole table.","title":"View Id"}},"required":["table_id"],"title":"AudiencePutSchema","type":"object"},"AudienceReplacementPreviewReadSchema":{"properties":{"already_present":{"title":"Already Present","type":"integer"},"capped":{"title":"Capped","type":"boolean"},"duplicate_rows":{"title":"Duplicate Rows","type":"integer"},"existing_contacts":{"title":"Existing Contacts","type":"integer"},"in_cooldown":{"title":"In Cooldown","type":"integer"},"in_other_sequence":{"title":"In Other Sequence","type":"integer"},"keep":{"$ref":"#/components/schemas/AudienceDiffReadSchema","description":"What keeping existing journeys does."},"missing_contact":{"title":"Missing Contact","type":"integer"},"new_contacts":{"title":"New Contacts","type":"integer"},"ongoing_contacts":{"title":"Ongoing Contacts","type":"integer"},"outside_selection":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outside Selection"},"previously_contacted":{"title":"Previously Contacted","type":"integer"},"restart":{"$ref":"#/components/schemas/AudienceDiffReadSchema","description":"What starting every journey fresh does."},"restart_blocked":{"title":"Restart Blocked","type":"integer"},"restart_ready":{"title":"Restart Ready","type":"integer"},"same_table":{"description":"The sequence already reads this table. Keeping journeys then applies the new filter to its contacts: those it no longer selects stop.","title":"Same Table","type":"boolean"},"selected_rows":{"title":"Selected Rows","type":"integer"},"source":{"title":"Source","type":"string"},"suppressed":{"title":"Suppressed","type":"integer"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["updated_at","selected_rows","new_contacts","already_present","missing_contact","duplicate_rows","suppressed","in_cooldown","in_other_sequence","restart_ready","restart_blocked","existing_contacts","ongoing_contacts","outside_selection","previously_contacted","capped","source","same_table","keep","restart"],"title":"AudienceReplacementPreviewReadSchema","type":"object"},"AudienceRestartReviewSchema":{"description":"An audience change that starts contacts over: who starts again, and who heard from it.","properties":{"at_least":{"default":false,"description":"True when the table is longer than the review reads: the counts are floors.","title":"At Least","type":"boolean"},"contacted_before":{"description":"How many of the selected rows were contacted before.","title":"Contacted Before","type":"integer"},"contacts":{"description":"Contacts already in the sequence who start again from the first step.","title":"Contacts","type":"integer"}},"required":["contacts","contacted_before"],"title":"AudienceRestartReviewSchema","type":"object"},"AutospintaxRequestSchema":{"description":"The drafted body to propose spintax rotations for.","properties":{"text":{"maxLength":50000,"minLength":1,"title":"Text","type":"string"}},"required":["text"],"title":"AutospintaxRequestSchema","type":"object"},"AutospintaxResponseSchema":{"properties":{"suggestions":{"items":{"$ref":"#/components/schemas/AutospintaxSuggestionReadSchema"},"title":"Suggestions","type":"array"}},"required":["suggestions"],"title":"AutospintaxResponseSchema","type":"object"},"AutospintaxSuggestionReadSchema":{"properties":{"options":{"items":{"type":"string"},"title":"Options","type":"array"},"sentence":{"title":"Sentence","type":"string"}},"required":["sentence","options"],"title":"AutospintaxSuggestionReadSchema","type":"object"},"BacklinkGroupField":{"description":"The attribute a backlink search may keep a fixed number of rows per.\n\nThe vendor's ``custom_mode`` takes a RESULT field name and a count, and\noverrides ``mode`` when set: \"two backlinks per referring domain\" is the\nshape ``one_per_domain`` cannot express. Only the first two values were\nprobed live (2026-09-20: ``domain_from`` and ``anchor`` both answered,\n``domain`` was refused by name); the rest are the other string fields of\na row, offered because the vendor names no vocabulary and refuses a\nstranger with a 40501 the transport pins to this control.","enum":["domain_from","anchor","url_from","tld_from","domain_from_country","page_from_language","item_type","semantic_location","url_to","domain_to"],"title":"BacklinkGroupField","type":"string"},"BacklinkLinkTypesFilterSchema":{"description":"Which kinds of link to include or exclude, from the index's own six.","properties":{"exclude":{"items":{"enum":["anchor","image","meta","canonical","alternate","redirect"],"type":"string"},"maxItems":8,"title":"Exclude","type":"array"},"include":{"items":{"enum":["anchor","image","meta","canonical","alternate","redirect"],"type":"string"},"maxItems":8,"title":"Include","type":"array"}},"title":"BacklinkLinkTypesFilterSchema","type":"object"},"BacklinkMode":{"description":"What one row of a backlink search is.\n\n``one_per_domain`` is the default and the lead-shaped answer: a table of\nreferring sites is a table of companies, each with a domain to enrich.\n``as_is`` is every backlink, several per site; ``one_per_anchor`` keeps\none per anchor text, which is a content question rather than a lead one.\nThe vendor's own default is ``as_is``; ours is not, because a table where\nthe same site appears forty times is not a table of leads.","enum":["as_is","one_per_domain","one_per_anchor"],"title":"BacklinkMode","type":"string"},"BacklinkSortKey":{"description":"The attribute a backlink search orders its rows by, in our words.\n\nEvery member is a whole-number or a date on the row: the ones an order\nmeans something for. The transport maps each to the vendor's field and\nsends it as ``order_by`` with the query's direction, by backlink rank\ndescending unless the query says otherwise, so the rows an import keeps\nare the top of an order the reader chose (``ROW_ORDER_BY_RECORD_TYPE``).","enum":["backlink_rank","domain_rank","page_rank","spam_score","first_seen","last_seen","prev_seen","links_count","group_count","page_external_links","page_internal_links","page_size_bytes","page_keywords_top_3","page_keywords_top_10","page_keywords_top_100","linked_spam_score"],"title":"BacklinkSortKey","type":"string"},"BacklinkStatus":{"description":"Which backlinks a search returns and counts: still live, lost, or both.","enum":["all","live","lost"],"title":"BacklinkStatus","type":"string"},"BacklinkValuesFilterSchema":{"description":"A text filter over backlink rows, capped at eight values each way.","properties":{"exclude":{"items":{"type":"string"},"maxItems":8,"title":"Exclude","type":"array"},"include":{"items":{"type":"string"},"maxItems":8,"title":"Include","type":"array"}},"title":"BacklinkValuesFilterSchema","type":"object"},"BacklinksQuerySchema":{"description":"The sites linking to a domain or a page.\n\nName the target and get one row per referring site by default, sorted by\nthe rank the link passes. Every attribute of a backlink the index can\nfilter on is here, in four groups: the referring site, the referring\npage, the link itself, and the page it points at. The index takes at most\neight filter conditions in one search, counting every value of every list\nas one; a ninth is refused rather than dropped.","properties":{"alt_texts":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words an image link's alt text contains."},"anchors":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words the anchor text contains."},"backlink_rank":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The rank the link passes to the target, on the scale chosen."},"dofollow":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only links that pass (or do not pass) rank."},"domain_rank":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The referring site's rank, on the scale chosen."},"exclude_internal":{"default":true,"description":"Whether links from the target's own subdomains are left out.","title":"Exclude Internal","type":"boolean"},"first_seen_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only links first found on or after this day, as YYYY-MM-DD.","title":"First Seen After"},"first_seen_before":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only links first found on or before this day, as YYYY-MM-DD.","title":"First Seen Before"},"group_count":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many links the referring site carries in all, when rows are one per site."},"image_urls":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words an image link's image URL contains."},"include_subdomains":{"default":true,"description":"Whether links to the target's subdomains count.","title":"Include Subdomains","type":"boolean"},"indirect_path_types":{"description":"How an indirect link reaches the target: redirect or canonical. Any of them.","items":{"enum":["redirect","canonical"],"type":"string"},"maxItems":8,"title":"Indirect Path Types","type":"array"},"is_broken":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only links pointing at a page that answers an error (or not)."},"is_indirect":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only links reaching the target through a redirect or canonical (or not)."},"is_lost":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only links that have been removed (or not)."},"is_new":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only links first found on the last visit (or not)."},"last_seen_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only links last seen on or after this day, as YYYY-MM-DD.","title":"Last Seen After"},"last_seen_before":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only links last seen on or before this day, as YYYY-MM-DD.","title":"Last Seen Before"},"link_types":{"anyOf":[{"$ref":"#/components/schemas/BacklinkLinkTypesFilterSchema"},{"type":"null"}],"description":"How the link is made: anchor, image, meta, canonical, alternate or redirect."},"linked_domains":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Domains the links point at, matched exactly."},"linked_spam_score":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The linked page's spam score, 0 to 100."},"linked_status_code":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The HTTP status the linked page answered."},"linked_url_https":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only links pointing at an HTTPS page (or not)."},"linked_urls":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words the linked page's URL contains."},"links_count":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many identical links the referring page carries."},"mode":{"$ref":"#/components/schemas/BacklinkMode","default":"one_per_domain","description":"What one row is: one_per_domain keeps one link per referring site (the default, and the one that makes a table of leads); as_is keeps every link; one_per_anchor keeps one per anchor text."},"original":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only links present on the page's first visit (or not)."},"page_encodings":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Character encodings of the referring page, like utf-8."},"page_external_links":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many external links the referring page carries."},"page_internal_links":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many internal links the referring page carries."},"page_keywords_top_10":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many keywords the referring page ranks in the top 10 for."},"page_keywords_top_100":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many keywords the referring page ranks in the top 100 for."},"page_keywords_top_3":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many keywords the referring page ranks in the top 3 for."},"page_languages":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Languages of the referring page, as ISO 639-1 codes."},"page_rank":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The referring page's rank, on the scale chosen."},"page_size_bytes":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The referring page's size, in bytes."},"page_status_code":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The HTTP status the referring page answered."},"page_titles":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words the referring page's title contains."},"per_field":{"anyOf":[{"$ref":"#/components/schemas/BacklinkGroupField"},{"type":"null"}],"description":"Keep a fixed number of links per value of this attribute instead of using mode: domain_from for a few links per referring site, anchor for a few per anchor text. Needs per_field_limit."},"per_field_limit":{"anyOf":[{"maximum":1000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"How many links to keep per value of per_field.","title":"Per Field Limit"},"prev_seen_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only links whose visit before last was on or after this day, as YYYY-MM-DD.","title":"Prev Seen After"},"prev_seen_before":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only links whose visit before last was on or before this day, as YYYY-MM-DD.","title":"Prev Seen Before"},"rank_scale":{"$ref":"#/components/schemas/RankScale","default":"one_hundred","description":"The scale the three ranks are reported and filtered on: 0 to 100 (the default) or 0 to 1000."},"redirect_targets":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words the redirect's final URL contains."},"referring_countries":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Countries of the referring site, as ISO alpha-2 codes or picker names."},"referring_domain_is_ip":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only referring sites that are (or are not) a bare IP address."},"referring_domains":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Referring sites, by host, matched exactly."},"referring_ips":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"IP addresses of the referring site."},"referring_platform_types":{"description":"Kinds of referring site to keep, any of them: cms, blogs, ecommerce, message-boards, wikis, news, organization or unknown. There is no exclude.","items":{"enum":["cms","blogs","ecommerce","message-boards","wikis","news","organization","unknown"],"type":"string"},"maxItems":8,"title":"Referring Platform Types","type":"array"},"referring_tlds":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Top-level domains of the referring site, like com or edu."},"referring_url_https":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only referring pages served over HTTPS (or not)."},"referring_urls":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words the referring page's URL contains."},"semantic_locations":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"The HTML element the link sits in: article, section, footer, nav and so on."},"sort_by":{"$ref":"#/components/schemas/BacklinkSortKey","default":"backlink_rank","description":"Which attribute orders the rows, and so which rows an import keeps when more match than it adds. Backlink rank by default."},"sort_descending":{"default":true,"description":"Highest or latest first.","title":"Sort Descending","type":"boolean"},"spam_score":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The link's spam score, 0 to 100."},"status":{"$ref":"#/components/schemas/BacklinkStatus","default":"live","description":"Which links are returned and counted: live (still found on the last visit, the default), lost, or all."},"target":{"anyOf":[{"maxLength":2048,"type":"string"},{"type":"null"}],"description":"The site whose backlinks to find: a domain or subdomain written bare (acme.com, blog.acme.com), or a page as its whole URL. Required; nothing else can anchor a backlink search.","title":"Target"},"text_after":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words the text just after the link contains."},"text_before":{"anyOf":[{"$ref":"#/components/schemas/BacklinkValuesFilterSchema"},{"type":"null"}],"description":"Words the text just before the link contains."}},"title":"BacklinksQuerySchema","type":"object"},"BillingPortalRequest":{"description":"Request schema for creating a billing portal session.","properties":{"return_path":{"default":"/billing","description":"Partial path (e.g. /billing) the portal's 'return to site' link goes to.","maxLength":255,"minLength":1,"title":"Return Path","type":"string"}},"title":"BillingPortalRequest","type":"object"},"BillingPortalResponse":{"description":"Response schema for billing portal session.","properties":{"url":{"description":"The URL to redirect the customer to access the billing portal.","format":"uri","maxLength":2083,"minLength":1,"title":"Url","type":"string"}},"required":["url"],"title":"BillingPortalResponse","type":"object"},"Body_forward_message":{"properties":{"mailbox_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Mailbox Id"},"note":{"default":"","maxLength":100000,"title":"Note","type":"string"},"to":{"maxLength":2000,"minLength":1,"title":"To","type":"string"}},"required":["to"],"title":"Body_forward_message","type":"object"},"Body_preview_table_import_csv":{"properties":{"file":{"description":"The .csv or .xlsx file to import.","format":"binary","title":"File","type":"string"}},"required":["file"],"title":"Body_preview_table_import_csv","type":"object"},"Body_reply_in_thread":{"properties":{"bcc":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Bcc"},"body_text":{"maxLength":100000,"minLength":1,"title":"Body Text","type":"string"},"cc":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Cc"},"channel":{"anyOf":[{"$ref":"#/components/schemas/InboxChannel"},{"type":"null"}]},"files":{"anyOf":[{"items":{"format":"binary","type":"string"},"type":"array"},{"type":"null"}],"title":"Files"},"include_history":{"default":false,"title":"Include History","type":"boolean"},"mailbox_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Mailbox Id"},"omit_signature":{"default":false,"title":"Omit Signature","type":"boolean"},"reply_to_message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Reply To Message Id"},"subject":{"anyOf":[{"maxLength":998,"type":"string"},{"type":"null"}],"title":"Subject"},"to":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"To"}},"required":["body_text"],"title":"Body_reply_in_thread","type":"object"},"Body_upload_ai_context_document":{"properties":{"file":{"description":"The document to attach.","format":"binary","title":"File","type":"string"}},"required":["file"],"title":"Body_upload_ai_context_document","type":"object"},"Body_upload_chat_attachment":{"properties":{"file":{"description":"The .csv, .xlsx or .pdf file to send.","format":"binary","title":"File","type":"string"}},"required":["file"],"title":"Body_upload_chat_attachment","type":"object"},"BounceSeverity":{"description":"Hard vs soft severity of a BOUNCE message.\n\nOnly HARD marks the contact bounced (the Bounced condition, the enrolment\nanalytics bounce rate, the per-message outcome). SOFT still fills the\nBounces view and never looks like a reply, but the address may still be\nreachable, so the cadence is left alone.","enum":["hard","soft"],"title":"BounceSeverity","type":"string"},"BranchSplitReadSchema":{"description":"How a branching step divided its contacts.","properties":{"branches":{"additionalProperties":{"type":"integer"},"description":"A connection request's contacts per branch it sent them down: connected, already_connected (when it has that branch) and not_accepted.","propertyNames":{"$ref":"#/components/schemas/SequenceEdgeBranch"},"title":"Branches","type":"object"},"no":{"description":"A condition's No branch. Zero on a connection request.","title":"No","type":"integer"},"reasons":{"additionalProperties":{"type":"integer"},"description":"A connection request's contacts per reason they took their branch: accepted, already_connected, expired, declined, or why no request could go out.","propertyNames":{"$ref":"#/components/schemas/InviteOutcome"},"title":"Reasons","type":"object"},"step_id":{"format":"uuid","title":"Step Id","type":"string"},"yes":{"description":"A condition's Yes branch. Zero on a connection request.","title":"Yes","type":"integer"}},"required":["step_id","yes","no"],"title":"BranchSplitReadSchema","type":"object"},"BuiltInMessageTemplateReadSchema":{"description":"One template we ship, the same in every workspace: a cold email with blanks to fill.","properties":{"body_segments":{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"title":"Body Segments","type":"array"},"description":{"description":"What the template is for, in a few words.","title":"Description","type":"string"},"follow_up":{"description":"Written to nudge an earlier email: listed first on a follow-up, and not at all on a sequence's first email.","title":"Follow Up","type":"boolean"},"key":{"title":"Key","type":"string"},"name":{"title":"Name","type":"string"}},"required":["key","name","description","body_segments","follow_up"],"title":"BuiltInMessageTemplateReadSchema","type":"object"},"BuiltinAgentSettings":{"description":"Settings for a built-in agent column: which columns supply which facts.\n\nThe same contract an :class:`EnrichmentSettings` column carries, and for\nthe same reason. A built-in agent is configured entirely server-side\n(prompt, model, reach and output shape all live on the agent row), so the\nONE thing a column decides is where each declared input comes from.\n\nThose bound cells are also all the agent sees. Its predecessor folded in\nthe whole row (optionally narrowed to a chosen subset), which made the\nsame agent read a different question on every table, cost the most on the\nwidest ones, and quietly answer from whatever cell happened to sit beside\nthe one it wanted. Now an input reaches the prompt only by being declared\nand bound, keyed by the agent's CANONICAL name (``domain``,\n``full_name``), so renaming a column changes nothing here.\n\nA stored binding whose declaration is gone is ignored rather than\nresurrecting a fact nobody asked for.","properties":{"input_bindings":{"additionalProperties":{"format":"uuid","type":"string"},"description":"Declared input name → the column that supplies it.","maxProperties":8,"title":"Input Bindings","type":"object"},"kind":{"const":"builtin","default":"builtin","title":"Kind","type":"string"}},"title":"BuiltinAgentSettings","type":"object"},"BuiltinAgentShelf":{"description":"The Enrichment tab shelf a built-in agent is ALSO listed on.\n\nA built-in agent lives on the Agent tab, where it sits beside the agents a\ncustomer wrote. The ones that answer an outcome someone shops the\nEnrichment tab for (research a company, write the email) are listed there\ntoo, on a shelf of their own after the data shelves, because that is where\npeople look for them. Authored per agent in ``agents_catalog.yaml`` so the\nshelf is decided where the agent is defined, the way a waterfall's family\nis, rather than guessed from a label in the frontend.","enum":["research","write"],"title":"BuiltinAgentShelf","type":"string"},"BuiltinAgentTemplateListResponseSchema":{"description":"The built-in agent templates visible to the organisation, in picker order.","properties":{"templates":{"items":{"$ref":"#/components/schemas/BuiltinAgentTemplateSchema"},"title":"Templates","type":"array"}},"required":["templates"],"title":"BuiltinAgentTemplateListResponseSchema","type":"object"},"BuiltinAgentTemplateSchema":{"description":"One built-in agent, disclosed as a copyable starting point.\n\nThe agents page renders these as its template cards; picking one copies\nevery field into a fresh saved-agent editor. Deliberately the opposite of\nthe picker's action spec, which HIDES prompt and model because a built-in\ncolumn is configured server-side. A template exists to be read and\nowned, so full disclosure is the feature.\n\nThe agent's instructions are its ``prompt`` in full. The stored\n``extra_context`` is NOT disclosed: it is the platform's own answering\nrulebook, composed at reconcile time and tied to how built-in runs are\npriced and refunded, not prose an owner wrote or should inherit.","properties":{"description":{"title":"Description","type":"string"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lucide icon token; null renders the default.","title":"Icon"},"inputs":{"description":"The agent's declared inputs, carried over so a copy keeps the same contract. A built-in binds these to columns rather than naming them in its prompt, so the copied prompt references none of them until its new owner does.","items":{"$ref":"#/components/schemas/AgentInputSchema"},"title":"Inputs","type":"array"},"is_template":{"description":"Whether this one is curated as a worked example. Every visible built-in is listed; the agents hub features the curated few as cards and leaves the rest to the gallery.","title":"Is Template","type":"boolean"},"key":{"title":"Key","type":"string"},"model_key":{"title":"Model Key","type":"string"},"name":{"title":"Name","type":"string"},"output_schema":{"discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Output","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Output"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}],"title":"Output Schema"},"prompt":{"title":"Prompt","type":"string"},"prompt_template":{"$ref":"#/components/schemas/AgentPromptTemplate-Output","description":"The prompt as editor-ready segments: what a copied template seeds the saved-agent editor with."},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline"},"use_business_context":{"description":"Whether runs fold in the org's AI business context. Copied into the saved agent so a template built around it keeps working.","title":"Use Business Context","type":"boolean"},"web_research":{"title":"Web Research","type":"boolean"}},"required":["key","name","description","tagline","icon","model_key","prompt","web_research","use_business_context","prompt_template","inputs","is_template","output_schema"],"title":"BuiltinAgentTemplateSchema","type":"object"},"BuiltinVariable":{"description":"Non-column variables the composer offers.\n\nWeekday variables render the *name* of the day (\"Thursday\") so a cadence\ncan reference real days without weekly rewrites.","enum":["sender_first_name","sender_full_name","sender_title","sender_booking_link","sending_domain","sequence_name","greeting","today","yesterday","tomorrow","day_plus_2","day_plus_3","day_plus_4"],"title":"BuiltinVariable","type":"string"},"BulkApproveSchema":{"description":"The ticked rows, and which of them the person had opened.","properties":{"opened_task_ids":{"description":"The ticked tasks the person opened and read before approving. Words the agent wrote on those that nobody changed are recorded as approved as written: a record of their Looks good, which never trains the agent.","items":{"format":"uuid","type":"string"},"maxItems":200,"title":"Opened Task Ids","type":"array"},"task_ids":{"items":{"format":"uuid","type":"string"},"maxItems":200,"minItems":1,"title":"Task Ids","type":"array"}},"required":["task_ids"],"title":"BulkApproveSchema","type":"object"},"BulkDecisionResponseSchema":{"description":"What the batch actually did, so the page can say so in one sentence.","properties":{"decided":{"description":"How many rows the decision applied to.","title":"Decided","type":"integer"},"schedule":{"anyOf":[{"$ref":"#/components/schemas/OutreachApprovalScheduleReadSchema"},{"type":"null"}],"description":"For an approval, when the approved work is expected to run: per sender for LinkedIn, and the emails' count and start. Null for a rejection, and when the schedule could not be read (the approval stands either way)."},"skipped":{"description":"How many had already moved on (settled, decided by somebody else, or a task nobody approves), and how many LinkedIn steps LinkedIn could not take now (the sender is not connected), which still wait. Not an error: a selection goes stale while it is read.","title":"Skipped","type":"integer"}},"required":["decided","skipped"],"title":"BulkDecisionResponseSchema","type":"object"},"BulkDoneUpdateSchema":{"description":"Mark a selection done, or clear the mark.","properties":{"done":{"description":"True marks the conversations done now; false clears the mark.","title":"Done","type":"boolean"},"thread_ids":{"items":{"format":"uuid","type":"string"},"maxItems":200,"minItems":1,"title":"Thread Ids","type":"array"}},"required":["thread_ids","done"],"title":"BulkDoneUpdateSchema","type":"object"},"BulkHealthCheckSelectionSchema":{"description":"Integration selection for a bulk health check.\n\nEither an explicit ``ids`` list (the per-page selection) OR a ``filters``-based\nselect-all that spans every page (optionally minus ``exclude_ids``). Exactly one of\n``ids`` / ``filters`` must be provided.","properties":{"exclude_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":10000,"type":"array"},{"type":"null"}],"description":"Integration IDs to exclude from a filter-based (select-all) selection.","title":"Exclude Ids"},"filters":{"anyOf":[{"$ref":"#/components/schemas/ListIntegrationsFilterParamsSchema"},{"type":"null"}],"description":"Select-all: check every integration matching these filters (all pages)."},"ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":10000,"minItems":1,"type":"array"},{"type":"null"}],"description":"Explicit integration IDs to check (per-page selection).","title":"Ids"}},"title":"BulkHealthCheckSelectionSchema","type":"object"},"BulkJourneyContactsResponseSchema":{"properties":{"changed":{"description":"How many contacts actually took the action. A selection is rarely uniform, so rows the action cannot apply to are skipped, not failed.","title":"Changed","type":"integer"},"in_other_sequence":{"default":0,"description":"Of the skipped, the failed contacts a retry left failed because another live sequence has taken them since. They stay on the step that broke, for a retry once that sequence is done with them.","title":"In Other Sequence","type":"integer"}},"required":["changed"],"title":"BulkJourneyContactsResponseSchema","type":"object"},"BulkJourneyContactsSchema":{"description":"One journey action applied to a selection of contacts.\n\nThe selection is exactly what the person ticked: some rows, or the header\ncheckbox, which is every contact the filter matches less any unticked\nsince. A scope='ids' request still has to name at least one contact.","properties":{"action":{"$ref":"#/components/schemas/JourneyAction"},"created_from":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only remove contacts added on or after this instant. The grid's date range, which a scope='all' removal has to honour or it reaches past what the person was looking at.","title":"Created From"},"created_to":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created To"},"enrolment_ids":{"items":{"format":"uuid","type":"string"},"maxItems":1000,"title":"Enrolment Ids","type":"array"},"exclude":{"default":false,"description":"Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.","title":"Exclude","type":"boolean"},"excluded_ids":{"description":"With scope='all', contacts to leave out: the rows unticked after ticking the header checkbox.","items":{"format":"uuid","type":"string"},"maxItems":1000,"title":"Excluded Ids","type":"array"},"group":{"anyOf":[{"$ref":"#/components/schemas/ContactGroup"},{"type":"null"}],"description":"The Audience tab's tab the grid was showing. A scope='all' action reaches only the contacts under it, or Select all under one tab would act on everyone."},"scope":{"default":"ids","enum":["ids","all"],"title":"Scope","type":"string"},"search":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Search"},"sort":{"$ref":"#/components/schemas/EnrolmentSort","default":"created_desc","description":"The order the grid was listing in. Under a 'group', a scope='all' action judges the same contacts the tab's list judged in that order."},"statuses":{"anyOf":[{"items":{"$ref":"#/components/schemas/EnrolmentStatus"},"type":"array"},{"type":"null"}],"title":"Statuses"},"stop_reasons":{"anyOf":[{"items":{"$ref":"#/components/schemas/StopReason"},"type":"array"},{"type":"null"}],"title":"Stop Reasons"}},"required":["action"],"title":"BulkJourneyContactsSchema","type":"object"},"BulkLabelUpdateSchema":{"properties":{"label_id":{"format":"uuid","title":"Label Id","type":"string"},"thread_ids":{"items":{"format":"uuid","type":"string"},"maxItems":200,"minItems":1,"title":"Thread Ids","type":"array"}},"required":["thread_ids","label_id"],"title":"BulkLabelUpdateSchema","type":"object"},"BulkReadResponseSchema":{"properties":{"updated":{"title":"Updated","type":"integer"}},"required":["updated"],"title":"BulkReadResponseSchema","type":"object"},"BulkReadUpdateSchema":{"properties":{"read":{"title":"Read","type":"boolean"},"thread_ids":{"items":{"format":"uuid","type":"string"},"maxItems":500,"minItems":1,"title":"Thread Ids","type":"array"}},"required":["thread_ids","read"],"title":"BulkReadUpdateSchema","type":"object"},"BulkRejectSchema":{"description":"The ticked rows and the one reason that settles every one of them.","properties":{"reason":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{"type":"null"}],"description":"Why they were refused, kept on every task it settled as its note. A bulk rejection teaches the agent nothing; the Tasks page sends no reason with one.","title":"Reason"},"task_ids":{"items":{"format":"uuid","type":"string"},"maxItems":200,"minItems":1,"title":"Task Ids","type":"array"}},"required":["task_ids"],"title":"BulkRejectSchema","type":"object"},"BulkRemoveContactsResponseSchema":{"properties":{"removed":{"title":"Removed","type":"integer"}},"required":["removed"],"title":"BulkRemoveContactsResponseSchema","type":"object"},"BulkRemoveContactsSchema":{"description":"One bulk removal.","properties":{"created_from":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only remove contacts added on or after this instant. The grid's date range, which a scope='all' removal has to honour or it reaches past what the person was looking at.","title":"Created From"},"created_to":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created To"},"enrolment_ids":{"items":{"format":"uuid","type":"string"},"maxItems":1000,"title":"Enrolment Ids","type":"array"},"exclude":{"default":false,"description":"Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.","title":"Exclude","type":"boolean"},"excluded_ids":{"description":"With scope='all', contacts to leave out: the rows unticked after ticking the header checkbox.","items":{"format":"uuid","type":"string"},"maxItems":1000,"title":"Excluded Ids","type":"array"},"group":{"anyOf":[{"$ref":"#/components/schemas/ContactGroup"},{"type":"null"}],"description":"The Audience tab's tab the grid was showing. A scope='all' action reaches only the contacts under it, or Select all under one tab would act on everyone."},"limit":{"anyOf":[{"maximum":100000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"With scope='all', act on only the FIRST n of the resolved set (in the roster's order) instead of every match.","title":"Limit"},"scope":{"default":"ids","enum":["ids","all"],"title":"Scope","type":"string"},"search":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Search"},"sort":{"$ref":"#/components/schemas/EnrolmentSort","default":"created_desc","description":"The order the grid was listing in. Under a 'group', a scope='all' action judges the same contacts the tab's list judged in that order."},"statuses":{"anyOf":[{"items":{"$ref":"#/components/schemas/EnrolmentStatus"},"type":"array"},{"type":"null"}],"title":"Statuses"},"stop_reasons":{"anyOf":[{"items":{"$ref":"#/components/schemas/StopReason"},"type":"array"},{"type":"null"}],"title":"Stop Reasons"}},"title":"BulkRemoveContactsSchema","type":"object"},"BulkSnoozeSchema":{"description":"Snooze a selection, or wake it with a null ``snoozed_until``.","properties":{"snoozed_until":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the selection returns to the working views. Null cancels any snooze the threads are under.","title":"Snoozed Until"},"thread_ids":{"items":{"format":"uuid","type":"string"},"maxItems":200,"minItems":1,"title":"Thread Ids","type":"array"}},"required":["thread_ids"],"title":"BulkSnoozeSchema","type":"object"},"BulkThreadIdsSchema":{"properties":{"thread_ids":{"items":{"format":"uuid","type":"string"},"maxItems":200,"minItems":1,"title":"Thread Ids","type":"array"}},"required":["thread_ids"],"title":"BulkThreadIdsSchema","type":"object"},"CampaignBrief":{"additionalProperties":false,"description":"What one sequence's campaign is: the tested campaign it runs and why.\n\nWritten by tailoring and by nothing else; the Agent tab reads it and\nnever sends it back (the service keeps the stored one on every other\nwrite). Tailoring now rewrites the steps' instructions themselves and\nwrites only ``reason`` and ``goal`` here. ``audience``, ``why_now``,\n``angle`` and ``step_notes`` are what it wrote before: kept, and still\nread by the writer, for the agents that carry them. They were written by\na model from the audience table, so they are background, never facts:\nonly ``intent``, the person's own words, may be stated as fact.","properties":{"angle":{"default":"","maxLength":300,"title":"Angle","type":"string"},"audience":{"default":"","maxLength":300,"title":"Audience","type":"string"},"campaign_key":{"maxLength":64,"title":"Campaign Key","type":"string"},"chosen_by_person":{"default":false,"title":"Chosen By Person","type":"boolean"},"goal":{"default":"","maxLength":1000,"title":"Goal","type":"string"},"intent":{"default":"","maxLength":500,"title":"Intent","type":"string"},"minted":{"items":{"maxLength":64,"type":"string"},"maxItems":50,"title":"Minted","type":"array"},"reason":{"default":"","maxLength":300,"title":"Reason","type":"string"},"step_notes":{"additionalProperties":{"maxLength":300,"type":"string"},"maxProperties":50,"propertyNames":{"maxLength":64},"title":"Step Notes","type":"object"},"table_name":{"default":"","maxLength":255,"title":"Table Name","type":"string"},"tailoring_off":{"default":false,"title":"Tailoring Off","type":"boolean"},"why_now":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"title":"Why Now"}},"required":["campaign_key"],"title":"CampaignBrief","type":"object"},"CardLandingSchema":{"description":"The table a lead search's card would make: its name, how many it adds, a few who match.\n\nThe card leads with it, so a person sees the list they asked for before\napproving it. Every word is the server's; the dashboard draws it as given.","properties":{"adds":{"description":"How many rows it adds out of how many match: \"Adds 10 of 608 people\".","title":"Adds","type":"string"},"sample_columns":{"description":"The sample's column names, as the table names them.","items":{"type":"string"},"title":"Sample Columns","type":"array"},"sample_rows":{"description":"A few who match, one value per column. Empty for a search whose rows are bought.","items":{"items":{"type":"string"},"type":"array"},"title":"Sample Rows","type":"array"},"table_name":{"description":"The new table's name, the card's title.","title":"Table Name","type":"string"}},"required":["table_name","adds"],"title":"CardLandingSchema","type":"object"},"CardSearchSchema":{"description":"A lead search a card lists the filters of, as the search route takes it.\n\nDrawn by the dashboard through the Find leads page's own summary, so a\ncard names each filter as the page does, never by its route name.","properties":{"query":{"additionalProperties":true,"description":"The search's filters, filter name to value.","title":"Query","type":"object"},"record_type":{"$ref":"#/components/schemas/LeadRecordType","description":"Which lead search it is."}},"required":["record_type"],"title":"CardSearchSchema","type":"object"},"CategoriesResponseSchema":{"description":"Response schema wrapping a list of integration categories.","properties":{"categories":{"description":"List of all available integration categories.","items":{"$ref":"#/components/schemas/CategoryRead"},"title":"Categories","type":"array"},"total_integration_count":{"description":"Total number of integrations in the catalog. integration. Single source of truth for the catalog's overall size.","title":"Total Integration Count","type":"integer"}},"required":["categories","total_integration_count"],"title":"CategoriesResponseSchema","type":"object"},"CategoryRead":{"properties":{"description":{"description":"The description of the category.","title":"Description","type":"string"},"integration_count":{"description":"Number of integrations in this category (includes 'coming soon'; static regardless of search).","title":"Integration Count","type":"integer"},"name":{"description":"The name of the category.","title":"Name","type":"string"},"slug":{"description":"The slug of the category.","title":"Slug","type":"string"}},"required":["name","slug","description","integration_count"],"title":"CategoryRead","type":"object"},"CellFeedbackBulkRequestSchema":{"description":"One verdict, applied to many cells.\n\nThe rating and the note are shared on purpose: a swept selection is one\njudgement about one thing the column got wrong, so asking for the sentence\nN times would collect N copies of it.","properties":{"cells":{"description":"The cells to rate.","items":{"$ref":"#/components/schemas/CellFeedbackTargetSchema"},"maxItems":1000,"minItems":1,"title":"Cells","type":"array"},"comment":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"description":"What was wrong, in the user's own words. Applied to every named cell. Optional.","title":"Comment"},"rating":{"$ref":"#/components/schemas/CellFeedbackRating"}},"required":["cells","rating"],"title":"CellFeedbackBulkRequestSchema","type":"object"},"CellFeedbackBulkResponseSchema":{"description":"Result of a bulk rating; cells that could not be rated are counted.\n\nNo echo of the stored verdicts: the caller already knows the one rating and\none note it sent, so returning a thousand identical copies would say\nnothing it could not derive. ``skipped_column_ids`` is the part it cannot.","properties":{"applied":{"description":"Cells whose verdict was written.","title":"Applied","type":"integer"},"skipped":{"description":"Cells refused because their column runs no saved agent to improve.","title":"Skipped","type":"integer"},"skipped_column_ids":{"description":"The distinct columns that refused, so the client can name them.","items":{"format":"uuid","type":"string"},"title":"Skipped Column Ids","type":"array"}},"required":["applied","skipped"],"title":"CellFeedbackBulkResponseSchema","type":"object"},"CellFeedbackRating":{"description":"How a person judged one produced cell value.","enum":["up","down"],"title":"CellFeedbackRating","type":"string"},"CellFeedbackRequestSchema":{"description":"One person's verdict on one produced cell value.","properties":{"comment":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"description":"What was wrong, in the user's own words. Optional.","title":"Comment"},"rating":{"$ref":"#/components/schemas/CellFeedbackRating"}},"required":["rating"],"title":"CellFeedbackRequestSchema","type":"object"},"CellFeedbackResponseSchema":{"description":"The current user's verdict on one cell, if they gave one.","properties":{"feedback":{"anyOf":[{"$ref":"#/components/schemas/CellFeedbackSchema"},{"type":"null"}]}},"required":["feedback"],"title":"CellFeedbackResponseSchema","type":"object"},"CellFeedbackSchema":{"description":"A stored verdict on one cell.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"rating":{"$ref":"#/components/schemas/CellFeedbackRating"},"row_id":{"format":"uuid","title":"Row Id","type":"string"},"saved_agent_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Saved Agent Id"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["column_id","row_id","rating","comment","saved_agent_id","created_at","updated_at"],"title":"CellFeedbackSchema","type":"object"},"CellFeedbackTargetSchema":{"description":"One cell named by a bulk rating.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"}},"required":["record_id","column_id"],"title":"CellFeedbackTargetSchema","type":"object"},"CellSettlementSchema":{"description":"One column's cells, split by how their last attempt ended.\n\nFILLED IS NOT COMPLETE, and reading them as the same number is the bug this\nshape exists to end. ``filled`` is a storage fact: the cell holds a value.\n``complete`` is a work fact: the last attempt reached a verdict, nothing has\ninvalidated it since, and no stopped run still owes a recompute. They\ndiverge in both directions. An enrichment that ran cleanly and found nothing\nis complete and empty, which on an AI column is the ordinary case; a cell\nholding last week's value under an edited formula is filled and incomplete.\n\nEvery figure counts only cells that HAVE a stored row. A cell nothing has\never attempted has no row at all, so a column's outstanding work is\n``row_count`` minus ``complete``, not a number reported here.","properties":{"complete":{"description":"Cells with nothing owed on them: a terminal verdict, still fresh, and not awaiting a recompute a stopped run never delivered. Excludes failures, which a retry can still fill.","title":"Complete","type":"integer"},"failed":{"description":"Cells that ran and errored. Retryable, so not complete.","title":"Failed","type":"integer"},"filled":{"description":"Cells holding a value in some typed slot.","title":"Filled","type":"integer"},"no_data":{"description":"Cells that ran cleanly and produced nothing. A definitive answer about this row rather than an incident. Free for a lookup; an AI column's cell is charged what it used.","title":"No Data","type":"integer"},"skipped":{"description":"Cells deliberately held back: a required input was empty, or the run condition was false.","title":"Skipped","type":"integer"},"stale":{"description":"Cells whose inputs changed after they were computed. Cuts across the other counts: a stale cell still shows its old value.","title":"Stale","type":"integer"},"succeeded":{"description":"Cells that ran and produced a value.","title":"Succeeded","type":"integer"}},"required":["filled","complete","succeeded","no_data","skipped","failed","stale"],"title":"CellSettlementSchema","type":"object"},"CellValue-Input":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"format":"date-time","type":"string"},{"format":"date","type":"string"},{"items":{"anyOf":[{"$ref":"#/components/schemas/CellValue-Input"},{"type":"null"}]},"type":"array"},{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/CellValue-Input"},{"type":"null"}]},"type":"object"}]},"CellValue-Output":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"format":"date-time","type":"string"},{"format":"date","type":"string"},{"items":{"anyOf":[{"$ref":"#/components/schemas/CellValue-Output"},{"type":"null"}]},"type":"array"},{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/CellValue-Output"},{"type":"null"}]},"type":"object"}]},"ChatAttachmentColumnValuesResponseSchema":{"description":"One attached file column's exact value frequencies and a page of its raw values.\n\nCounts cover every nonblank data row of the file's selected sheet, before\nany import row cap. Raw values are a page in file order, uncoerced.","properties":{"distribution":{"$ref":"#/components/schemas/ValueDistribution","description":"Exact raw value frequencies across the entire selected sheet or CSV, before row caps. Whitespace-only cells are empty; nonempty values are not coerced."},"name":{"description":"The column's name, from the header row.","title":"Name","type":"string"},"offset":{"description":"Where this page of raw values starts, counted from zero.","title":"Offset","type":"integer"},"raw_values":{"description":"Raw values for this page, in file order.","items":{"type":"string"},"title":"Raw Values","type":"array"},"source_index":{"description":"The field's zero-based position in the file.","title":"Source Index","type":"integer"}},"required":["source_index","name","offset","raw_values","distribution"],"title":"ChatAttachmentColumnValuesResponseSchema","type":"object"},"ChatAttachmentImportRequestSchema":{"description":"Build a table out of an attached file.","properties":{"header_row":{"default":0,"description":"For a file whose first row is a title: the row that holds the column names, numbered as a page of the file's rows numbers them (1 is the first row under the title). The table's columns are named from it and only the rows below it are added. 0 keeps the first row as the header.","minimum":0.0,"title":"Header Row","type":"integer"},"name":{"description":"What to call the table. Unique in the workspace.","maxLength":255,"minLength":1,"title":"Name","type":"string"},"row_ranges":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImportRowRangeSchema"},"maxItems":1000,"minItems":1,"type":"array"},{"type":"null"}],"description":"Only these rows, the way a print dialog picks pages, numbered as a page of the file's rows numbers them and as `header_row` is: 1 is the row at offset 0, the first under the file's first row, and every row holding any text counts, a row of placeholders like N/A included. So with `header_row` 2 the rows under the column names start at 3. A row the table gets no value from (only placeholders, or the column names and the rows above them) is left out. At most 100 ranges once merged. Omit for every row.","title":"Row Ranges"}},"required":["name"],"title":"ChatAttachmentImportRequestSchema","type":"object"},"ChatAttachmentImportResponseSchema":{"description":"The table an attached file is becoming.\n\nThe table exists when this returns; its rows are still arriving, loaded\nin the background from the file's own rows. ``row_count`` is how many\nwill land, which is the file's count clamped to the row ceiling, and the\nfile's own count stands beside it so a caller can say when the two differ\nrather than pass the smaller number off as the whole file.","properties":{"column_count":{"title":"Column Count","type":"integer"},"file_row_count":{"description":"Rows in the file, as its attachment card counts them, less the header row named and the rows above it.","title":"File Row Count","type":"integer"},"import_id":{"description":"The import job loading the rows, for polling.","format":"uuid","title":"Import Id","type":"string"},"limited_by":{"anyOf":[{"enum":["plan","deployment"],"type":"string"},{"type":"null"}],"description":"Whose ceiling it was: the plan's, which a bigger plan raises, or the deployment's, which none does. Null when nothing was cut.","title":"Limited By"},"row_count":{"description":"Rows that will be added: the rows chosen, or the file's from the top.","title":"Row Count","type":"integer"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The ceiling that cut the file short, or null when every row is being added.","title":"Row Limit"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"table_name":{"title":"Table Name","type":"string"}},"required":["table_id","table_name","import_id","row_count","file_row_count","row_limit","limited_by","column_count"],"title":"ChatAttachmentImportResponseSchema","type":"object"},"ChatAttachmentPagesResponseSchema":{"description":"Some of a PDF's pages, as text.\n\nEach page is laid out as the page prints it, so a table's rows stay one\nline each, with every gap between columns cut to three spaces. ``offset``\nis where the read starts, counted from zero, ``next_offset`` where the\nnext one does, and ``page_count`` is the whole PDF's.","properties":{"attachment_id":{"format":"uuid","title":"Attachment Id","type":"string"},"filename":{"title":"Filename","type":"string"},"next_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Where the next read starts, or null when this read reaches the last page. A read stops at a size as well as at `limit`, so this can come before `offset` plus `limit`.","title":"Next Offset"},"offset":{"description":"The first page here, counted from zero.","title":"Offset","type":"integer"},"page_count":{"description":"Pages in the whole PDF, not in this read.","title":"Page Count","type":"integer"},"pages":{"description":"Each page's text, in page order. A page with no text is empty, and a page whose text could not be read says so.","items":{"type":"string"},"title":"Pages","type":"array"}},"required":["attachment_id","filename","offset","pages","page_count","next_offset"],"title":"ChatAttachmentPagesResponseSchema","type":"object"},"ChatAttachmentReadSchema":{"description":"One file attached to a chat message, as the card above the message draws it.\n\nThe bytes are never returned; the shape is. ``columns`` and ``row_count``\nare what a card and a model's first look need, and a page of rows is a\nseparate read.","properties":{"column_count":{"title":"Column Count","type":"integer"},"columns":{"description":"The header row's names, in order; empty for a PDF.","items":{"type":"string"},"title":"Columns","type":"array"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"filename":{"title":"Filename","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"$ref":"#/components/schemas/WorkspaceChatAttachmentKind","description":"What the file is: `spreadsheet` for a CSV or an Excel sheet, `pdf` for a PDF."},"page_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A PDF's pages; null for a spreadsheet.","title":"Page Count"},"row_count":{"description":"Data rows under the header row; 0 for a PDF, whose table is read into rows only when its rows are first read.","title":"Row Count","type":"integer"},"sent":{"description":"Whether the file has been sent with a message. A file added and never sent can be removed; one already sent stays with its message.","title":"Sent","type":"boolean"},"sheet":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The workbook sheet the rows were read from; null for a CSV or a PDF.","title":"Sheet"},"size_bytes":{"title":"Size Bytes","type":"integer"}},"required":["id","filename","kind","size_bytes","row_count","column_count","columns","sheet","page_count","sent","created_at"],"title":"ChatAttachmentReadSchema","type":"object"},"ChatAttachmentRowsResponseSchema":{"description":"One page of a file's rows.\n\n``rows`` are rows of text, one cell per column of ``columns``, cells\nclipped to what a page keeps. ``offset`` is where the page starts,\ncounted from zero under the header, ``next_offset`` where the next one\ndoes, and ``row_count`` is the whole sheet's, so a reader knows how many\npages are left.","properties":{"attachment_id":{"format":"uuid","title":"Attachment Id","type":"string"},"columns":{"description":"The header row's names for the sheet read.","items":{"type":"string"},"title":"Columns","type":"array"},"comments":{"description":"Cell comments on this page's rows and on no data row (the header's, a title's), each with its `cell`, its `text` and its row's first value as `row_subject`. File content, as the rows are.","items":{"additionalProperties":{"type":"string"},"type":"object"},"title":"Comments","type":"array"},"filename":{"title":"Filename","type":"string"},"header_is_title":{"description":"Whether the first row is a one-cell title over a wider table, so the column names, if any, are in one of the rows below; the import and the column read take that row's number as `header_row`.","title":"Header Is Title","type":"boolean"},"next_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Where the next page starts, or null when this page reaches the end. A page stops at a size as well as at `limit`, so this can come before `offset` plus `limit`.","title":"Next Offset"},"notes":{"description":"Sentences about what reading the file had to do.","items":{"type":"string"},"title":"Notes","type":"array"},"offset":{"title":"Offset","type":"integer"},"row_count":{"description":"Data rows in the whole sheet read, not on this page.","title":"Row Count","type":"integer"},"rows":{"items":{"items":{"type":"string"},"type":"array"},"title":"Rows","type":"array"},"sheet":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The workbook sheet read; null for a CSV.","title":"Sheet"},"sheet_names":{"description":"Every visible sheet of the workbook, in tab order; empty for a CSV.","items":{"type":"string"},"title":"Sheet Names","type":"array"}},"required":["attachment_id","filename","columns","offset","rows","row_count","next_offset","sheet","sheet_names","header_is_title","comments","notes"],"title":"ChatAttachmentRowsResponseSchema","type":"object"},"CheckConnectionsOutcome":{"additionalProperties":false,"description":"One reading of our own connections list, newest connection first.\n\n``rows`` are what the browser reported; the server keeps them on the\nreading's own log row and strips them from here before the action settles,\nso this document ends up with the counts only (``rows_read``,\n``rows_unread``) and nobody's key outlives its retention on a step's row.\n\n``member_urn`` echoes the salt every key was hashed with\n(``CheckConnectionsParams.member_urn``); a reading salted for any member\nbut the account's proves nothing. ``sort_proven`` says the list was shown\n\"Recently added\" by a token that cannot be a position or a word; a reading\nthat cannot prove it is never judged, though the members it lists are\nstill matched. ``stable`` says two snapshots taken apart agreed. ``empty``\nis LinkedIn's own empty-list surface. ``pages`` counts the batches read\n(one, plus each \"Show more\"), ``more_available`` whether LinkedIn offered\nanother, ``reached_watermark`` whether the reading got back to the last\none's rows. ``named_by`` says which spellings rows carried, which decides\nwhich ledger rows a reading can match at all.","properties":{"complete":{"default":false,"title":"Complete","type":"boolean"},"empty":{"default":false,"title":"Empty","type":"boolean"},"kind":{"const":"check_connections","default":"check_connections","title":"Kind","type":"string"},"member_urn":{"maxLength":128,"title":"Member Urn","type":"string"},"more_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"More Available"},"named_by":{"items":{"enum":["vanity","member","fsd_profile"],"type":"string"},"maxItems":3,"title":"Named By","type":"array"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"pages":{"default":0,"maximum":6.0,"minimum":0.0,"title":"Pages","type":"integer"},"reached_watermark":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reached Watermark"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"rows":{"items":{"$ref":"#/components/schemas/LinkedInConnectionRow"},"maxItems":400,"title":"Rows","type":"array"},"rows_read":{"anyOf":[{"maximum":400.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Rows Read"},"rows_unread":{"anyOf":[{"maximum":400.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Rows Unread"},"sort_proven":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sort Proven"},"stable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stable"}},"required":["member_urn"],"title":"CheckConnectionsOutcome","type":"object"},"CheckConnectionsParams":{"additionalProperties":false,"description":"Housekeeping: read the newest rows of our own connections list.\n\n``member_urn`` is the account's member as the server holds it: the exact\nstring the browser salts every row key with, and echoes on the outcome.\n``watermark_keys`` are the keys of the rows the last reading saw, newest\nfirst, so the browser knows how far back \"Show more\" needs to go; it may\npress it at most ``max_more`` times. Both are empty and zero on a first\nreading, which is then judged on its first batch alone, and the keys are\nsent only while \"Show more\" may be pressed at all.","properties":{"kind":{"const":"check_connections","default":"check_connections","title":"Kind","type":"string"},"max_more":{"default":0,"maximum":5.0,"minimum":0.0,"title":"Max More","type":"integer"},"member_urn":{"maxLength":128,"title":"Member Urn","type":"string"},"watermark_keys":{"items":{"pattern":"^[0-9a-f]{32}$","type":"string"},"maxItems":400,"title":"Watermark Keys","type":"array"}},"required":["member_urn"],"title":"CheckConnectionsParams","type":"object"},"CheckInboxOutcome":{"additionalProperties":false,"description":"One reading of the conversation list.\n\nRows the scan could not name are why a reading is not ``complete``.","properties":{"complete":{"default":false,"title":"Complete","type":"boolean"},"conversations":{"items":{"$ref":"#/components/schemas/LinkedInConversationRow"},"maxItems":500,"title":"Conversations","type":"array"},"kind":{"const":"check_inbox","default":"check_inbox","title":"Kind","type":"string"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]}},"title":"CheckInboxOutcome","type":"object"},"CheckInboxParams":{"additionalProperties":false,"description":"Housekeeping: scan the conversation list for new inbound activity. Takes nothing.","properties":{"kind":{"const":"check_inbox","default":"check_inbox","title":"Kind","type":"string"}},"title":"CheckInboxParams","type":"object"},"CheckSentInvitationsOutcome":{"additionalProperties":false,"description":"One reading of the sent-invitations list, as the members still outstanding.\n\nA list with no rows is only ``complete`` when LinkedIn's own empty-list\nsurface was seen, because the list loading is the action here and a list\nthat never rendered is an honest failure. Every urn the reading omits is\nmarked disappeared, a state that does not recover on the next reading, so\na reading with a row it could not name is reported and never complete.\n\nThe list LinkedIn renders now names each member only by the ``/in/<slug>``\nof their profile link, and draws the newest rows first with the rest\nloading on scroll, which a background tab never does: ``newest_only`` is\nsuch a reading, the top of the list and not all of it, and is judged only\nas far down as it reaches (see ``sql_repository.apply_sweep``).","properties":{"complete":{"default":false,"title":"Complete","type":"boolean"},"kind":{"const":"check_sent_invitations","default":"check_sent_invitations","title":"Kind","type":"string"},"newest_only":{"default":false,"title":"Newest Only","type":"boolean"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"still_pending_urns":{"items":{"maxLength":128,"type":"string"},"maxItems":2000,"title":"Still Pending Urns","type":"array"},"still_pending_vanities":{"items":{"maxLength":200,"type":"string"},"maxItems":2000,"title":"Still Pending Vanities","type":"array"}},"title":"CheckSentInvitationsOutcome","type":"object"},"CheckSentInvitationsParams":{"additionalProperties":false,"description":"Housekeeping: read our own sent-invitations list. Takes nothing.","properties":{"kind":{"const":"check_sent_invitations","default":"check_sent_invitations","title":"Kind","type":"string"}},"title":"CheckSentInvitationsParams","type":"object"},"ColumnCreditRateSchema":{"description":"One paid column's price for one row: the most it can cost, and what it usually costs.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"credits_per_row":{"description":"The most one row of this column can cost.","title":"Credits Per Row","type":"number"},"usual_credits_per_row":{"description":"What one row usually costs, from what the same kind of cell has been charged before. With no history yet, a typical share of credits_per_row for a column charged by use, and credits_per_row for a flat price.","title":"Usual Credits Per Row","type":"number"}},"required":["column_id","credits_per_row","usual_credits_per_row"],"title":"ColumnCreditRateSchema","type":"object"},"ColumnMappingSchema":{"description":"Which audience columns carry a meaning, all detected from the table.\n\nOne field per channel (email, LinkedIn) plus the company domain the\ncoverage line reports on. Leave the whole object out when binding an\naudience and the columns are detected server-side. Send it only to correct\na detection: a first name, a company or a last-contacted date is no longer\npart of this, because every column on the table is already addressable as a\n`{{Column name}}` variable.","properties":{"company_domain_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The account identity, reported on by the audience coverage counts. Unmapped, the coverage count is zero.","title":"Company Domain Column Id"},"email_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Where the send address is read from, and the deduplication key: two rows sharing an address are one contact.","title":"Email Column Id"},"email_deliverability_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The column holding each address's deliverability verdict, usually the Verify email column over the email column; detected when the table has one. Read only while an email column is mapped, and dropped without one. An address is emailed only when its verdict is one of `email_deliverability_results`; any other verdict skips the email step (LinkedIn steps still run), and an address not verified yet waits for its verdict. Unmapped, every address is emailed unverified.","title":"Email Deliverability Column Id"},"email_deliverability_results":{"description":"The verdicts the sequence emails: valid, catch-all, risky, unknown, invalid or disposable. Valid alone by default; an empty list reads as the default. An answer the column could not give counts as unknown.","items":{"$ref":"#/components/schemas/EmailDeliverability"},"maxItems":6,"title":"Email Deliverability Results","type":"array"},"linkedin_url_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Required by LinkedIn steps; a row without one skips them.","title":"Linkedin Url Column Id"}},"title":"ColumnMappingSchema","type":"object"},"ColumnMappingUpdateSchema":{"properties":{"mapping":{"$ref":"#/components/schemas/ColumnMappingSchema"}},"required":["mapping"],"title":"ColumnMappingUpdateSchema","type":"object"},"ColumnRef":{"description":"A parameter that reads another column's cell value on the same row.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"ref":{"const":"column","default":"column","title":"Ref","type":"string"}},"required":["column_id"],"title":"ColumnRef","type":"object"},"ColumnRunEstimateSchema":{"description":"One column a run would work on, in the order it runs, and what its part costs.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"credits_at_most":{"description":"The most this column's part of the run can cost, in credits.","title":"Credits At Most","type":"number"},"credits_usually":{"description":"What this column's part usually costs, in credits, from what the same kind of cell has been charged before, or a typical share of credits_at_most while there is no history yet. Equal to credits_at_most for a flat price.","title":"Credits Usually","type":"number"},"display_name":{"description":"The column's name, as the table shows it.","title":"Display Name","type":"string"}},"required":["column_id","display_name","credits_at_most","credits_usually"],"title":"ColumnRunEstimateSchema","type":"object"},"ColumnTemplateApplyResponseSchema":{"description":"What an apply created.","properties":{"created_column_ids":{"description":"The new columns, in template order.","items":{"format":"uuid","type":"string"},"title":"Created Column Ids","type":"array"}},"required":["created_column_ids"],"title":"ColumnTemplateApplyResponseSchema","type":"object"},"ColumnTemplateApplySchema":{"description":"Replay a template onto a table.","properties":{"position":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"Insert position of the FIRST column; the rest follow it contiguously, in template order. Appended when omitted.","title":"Position"},"table_id":{"description":"The table to create the columns on.","format":"uuid","title":"Table Id","type":"string"}},"required":["table_id"],"title":"ColumnTemplateApplySchema","type":"object"},"ColumnTemplateCreateSchema":{"description":"Capture a selection of a table's columns as a named template.","properties":{"column_ids":{"description":"The columns to capture; stored in display order.","items":{"format":"uuid","type":"string"},"maxItems":50,"minItems":1,"title":"Column Ids","type":"array"},"description":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Description"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"table_id":{"description":"The table the columns live on.","format":"uuid","title":"Table Id","type":"string"}},"required":["name","table_id","column_ids"],"title":"ColumnTemplateCreateSchema","type":"object"},"ColumnTemplateListResponseSchema":{"description":"The org's templates, newest first.","properties":{"templates":{"items":{"$ref":"#/components/schemas/ColumnTemplateReadSchema"},"title":"Templates","type":"array"}},"required":["templates"],"title":"ColumnTemplateListResponseSchema","type":"object"},"ColumnTemplateReadSchema":{"description":"One template as the picker lists it.","properties":{"column_count":{"description":"How many columns the bundle holds.","title":"Column Count","type":"integer"},"column_names":{"description":"The columns the template creates, in order.","items":{"type":"string"},"title":"Column Names","type":"array"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name","description","column_count","column_names","created_at"],"title":"ColumnTemplateReadSchema","type":"object"},"CompanyMatchCheckSchema":{"description":"How many of the column's companies the people search has people at.","properties":{"checked":{"description":"How many of the column's companies were counted. Fewer than `companies` when the check ran out of time; asking again carries on.","title":"Checked","type":"integer"},"role":{"$ref":"#/components/schemas/EmployerRole","description":"Which job was counted: `current` (held now) or `past` (one that ended)."},"unmatched":{"description":"The first 100 of those companies, in row order.","items":{"$ref":"#/components/schemas/UnmatchedCompanySchema"},"title":"Unmatched","type":"array"},"unmatched_count":{"description":"How many counted companies no one in the people search works at, even matched by the domain the search files them under. A search following the column finds nobody there.","title":"Unmatched Count","type":"integer"}},"required":["role","checked","unmatched_count","unmatched"],"title":"CompanyMatchCheckSchema","type":"object"},"CompanyNameSuggestionSchema":{"description":"A company of the same name that the people search does have people at.","properties":{"name":{"description":"The company's name, as the table spells it.","title":"Name","type":"string"},"people":{"description":"How many people the people search holds at the company of that exact name, in the job the check counted (held now, or one that ended).","title":"People","type":"integer"}},"required":["name","people"],"title":"CompanyNameSuggestionSchema","type":"object"},"CompanyPostWindow":{"description":"How recently a company posted on the professional network, as a company search asks it.","enum":["past_week","past_month","past_quarter","past_year"],"title":"CompanyPostWindow","type":"string"},"CompanyQuerySchema":{"description":"Filters for a company search.","properties":{"category":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"What the site says the company does, read by the search rather than declared."},"cities":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Headquarters cities."},"company_type":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The company's type, one of: Privately Held, Public Company, Self-Employed, Self-Owned, Partnership, Nonprofit, Educational or Government Agency. Matched case-insensitively; any other value is refused rather than quietly matching nothing."},"countries":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Headquarters countries, written out in full."},"department_headcount":{"anyOf":[{"$ref":"#/components/schemas/TeamHeadcountFilterSchema"},{"type":"null"}],"description":"How many employees work in one department, for example at least 10 in Engineering and Technical. Reaches about half the companies. The team to count is one of: Administrative, Consulting, Customer Service, Design, Education, Engineering and Technical, Finance & Accounting, General Management, Human Resources, Legal, Marketing, Medical, Operations, Other, Product, Project Management, Real Estate, Research, Sales or Trades."},"domain":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The company's website domain, as stripe.com."},"enriched_keywords":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"What the company offers, products and services, as read off its site."},"exclude_expired_domains":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Excludes companies whose website domain has expired."},"executive_joined_within":{"anyOf":[{"$ref":"#/components/schemas/ExecutiveChangeWindow"},{"type":"null"}],"description":"Companies where an executive joined inside this window: past_month, past_quarter or past_year."},"executive_left_within":{"anyOf":[{"$ref":"#/components/schemas/ExecutiveChangeWindow"},{"type":"null"}],"description":"Companies where an executive left inside this window: past_month, past_quarter or past_year."},"executive_titles":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Narrows the executive changes above to these roles, for example Chief Revenue Officer. On its own, matches a company where someone joined in one of these roles."},"followers":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many followers the company's professional profile has."},"founded":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The year the company was founded."},"funding_round_types":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The type of the last round raised, for example Seed or Series A. Funding coverage is thin, so this narrows hard."},"funding_rounds_count":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many funding rounds the company has raised in all."},"has_api_docs":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company publishes API documentation."},"has_demo":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company offers a demo."},"has_free_trial":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company offers a free trial."},"has_mobile_apps":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company has mobile apps."},"has_online_reviews":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company has reviews on review sites."},"has_pricing_page":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company's website has a pricing page."},"has_website":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company has a website."},"headcount":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The company's employee count."},"headcount_growth":{"anyOf":[{"$ref":"#/components/schemas/GrowthFilterSchema"},{"type":"null"}],"description":"Headcount change as a percentage band, over the past month (1month), 3 months (3months) or 12 months (12months). The 6- and 24-month windows are refused."},"identifier":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Specific companies, as domains, LinkedIn company URLs, LinkedIn vanity names or numeric LinkedIn ids, mixed freely."},"industry":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The company's industry, from the lead database's fixed industry list. Matched case-insensitively; a value outside the list is refused and the nearest entry is named."},"is_b2b":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company sells to businesses, by the index's own reading."},"is_downloadable":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company offers software to download and install."},"is_saas":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether the company sells software as a service."},"keyword":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Words in the company's description."},"last_funding_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only companies whose last round closed on or after this day, as YYYY-MM-DD.","title":"Last Funding After"},"last_funding_amount":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The size of the last round raised, in US dollars. Rounds reported in another currency are left out."},"last_funding_before":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only companies whose last round closed on or before this day, as YYYY-MM-DD.","title":"Last Funding Before"},"linkedin_id":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The company's numeric LinkedIn id."},"linkedin_slug":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The company's LinkedIn vanity name, as in acme-inc."},"location":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Where the company's headquarters are. A country may be written as its name or its alpha-2 code; both are sent as the code. A comma narrows a city to its country, as in Paris, France; several values are alternatives."},"name":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The company's name, the brand it goes by."},"office_cities":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Cities the company has any office in, not just its headquarters."},"office_countries":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Countries the company has any office in, not just its headquarters."},"office_states":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"States or provinces the company has any office in, not just its headquarters."},"post_keyword":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Words in the company's posts on the professional network, within posted_within."},"post_reactions":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many reactions one of the company's posts drew."},"posted_within":{"anyOf":[{"$ref":"#/components/schemas/CompanyPostWindow"},{"type":"null"}],"description":"Companies that posted on the professional network inside this window: past_week, past_month, past_quarter or past_year."},"revenue":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Annual revenue in US dollars. A company matches when any of its revenue estimates falls inside the range. Only about one company in thirteen carries an estimate, so this narrows hard."},"seniority_headcount":{"anyOf":[{"$ref":"#/components/schemas/TeamHeadcountFilterSchema"},{"type":"null"}],"description":"How many employees sit at one seniority, for example at least 3 Directors. Reaches about half the companies. The team to count is one of: C-Level, Director, Founder, Head, Intern, Manager, Owner, Partner, President/Vice President, Senior, Specialist or Vice President."},"size_bands":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Headcount as a band, one of: Myself Only, 1-10 employees, 11-50 employees, 51-200 employees, 201-500 employees, 501-1000 employees, 1001-5000 employees, 5001-10,000 employees or 10,001+ employees. Offered beside the numeric headcount, not instead of it."},"social_networks":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Companies with a profile on any of these networks: facebook, instagram, youtube, x, twitter, tiktok, reddit, pinterest, github or discord. Matched case-insensitively; any other value is refused."},"specialities":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Categories and keywords filed on the company's profile."},"states":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Headquarters states or provinces, written out in full."},"technologies":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Technologies the company's website runs. Reaches only the companies whose site has been read, about one in six, so expect a smaller result than other filters give."},"technology_first_seen_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only count a technology FIRST seen on or after this day, as YYYY-MM-DD.","title":"Technology First Seen After"},"technology_verified_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only count a technology still seen on or after this day, as YYYY-MM-DD.","title":"Technology Verified After"},"unique_domain_only":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Excludes companies sharing a domain, which collapse into one row."}},"title":"CompanyQuerySchema","type":"object"},"CompanyTableFilterSchema":{"description":"The companies a search follows from a table, and the ones it leaves out.","properties":{"exclude":{"anyOf":[{"$ref":"#/components/schemas/CompanyTableLinkSchema"},{"type":"null"}],"description":"Leave out people whose employer is in this column."},"include":{"anyOf":[{"$ref":"#/components/schemas/CompanyTableLinkSchema"},{"type":"null"}],"description":"Only people whose employer is in this column."}},"title":"CompanyTableFilterSchema","type":"object"},"CompanyTableLinkSchema":{"description":"One column of one of your tables, read as a list of companies.","properties":{"column_id":{"description":"The column with each company's website, web address, LinkedIn company page or numeric LinkedIn id. A column of company names matches no one.","format":"uuid","title":"Column Id","type":"string"},"table_id":{"description":"The table holding the companies.","format":"uuid","title":"Table Id","type":"string"},"view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A saved view of that table: only the rows its filter keeps are read. Omit it to read every row.","title":"View Id"}},"required":["table_id","column_id"],"title":"CompanyTableLinkSchema","type":"object"},"CompanyTableResponseSchema":{"description":"What a table column holds right now, read the way a people search following it reads it.","properties":{"column_name":{"description":"The column's name.","title":"Column Name","type":"string"},"companies":{"description":"How many distinct companies the column holds now: websites, web addresses, LinkedIn company pages and ids, each counted once.","title":"Companies","type":"integer"},"examples":{"description":"The first few of those companies, in row order.","items":{"type":"string"},"title":"Examples","type":"array"},"matches":{"anyOf":[{"$ref":"#/components/schemas/CompanyMatchCheckSchema"},{"type":"null"}],"description":"Which companies no one in the people search works at, when `check_role` asked for it. Null otherwise, and for a column with no companies or more than a search can follow."},"names_skipped":{"description":"How many distinct values are not a company's website or LinkedIn page, such as company names or people's LinkedIn profiles. A search cannot match them, so it leaves them out.","title":"Names Skipped","type":"integer"},"table_name":{"description":"The table's name.","title":"Table Name","type":"string"},"too_many":{"description":"Whether the column holds more companies than one search can follow (5,000). A search following it is refused until a view narrows it.","title":"Too Many","type":"boolean"},"view_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The saved view whose rows are read, or null when every row is.","title":"View Name"}},"required":["table_name","column_name","view_name","companies","examples","names_skipped","too_many"],"title":"CompanyTableResponseSchema","type":"object"},"CompleteReplySchema":{"description":"The reply body typed so far, for the ghost-text continuation.","properties":{"draft_text":{"maxLength":4000,"minLength":1,"title":"Draft Text","type":"string"}},"required":["draft_text"],"title":"CompleteReplySchema","type":"object"},"ConnectInputKind":{"description":"The kind of a connect-time input the connect modal renders.","enum":["tenant","choice","region"],"title":"ConnectInputKind","type":"string"},"ConnectInputOptionSchema":{"description":"One selectable option of a choice/region connect input.","properties":{"label":{"title":"Label","type":"string"},"value":{"title":"Value","type":"string"}},"required":["value","label"],"title":"ConnectInputOptionSchema","type":"object"},"ConnectInputSchema":{"description":"A single connect-time input the connect modal renders.","properties":{"default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default"},"helper":{"title":"Helper","type":"string"},"kind":{"$ref":"#/components/schemas/ConnectInputKind","description":"tenant (free text), choice (options), or region (dropdown)."},"label":{"title":"Label","type":"string"},"name":{"title":"Name","type":"string"},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/ConnectInputOptionSchema"},"type":"array"},{"type":"null"}],"title":"Options"},"placeholder":{"title":"Placeholder","type":"string"},"required":{"title":"Required","type":"boolean"}},"required":["kind","name","label","placeholder","helper","required"],"title":"ConnectInputSchema","type":"object"},"ConnectionRequestOutcome":{"additionalProperties":false,"description":"What sending an invitation produced: the common fields and the nine profile facts.\n\nThe facts are read twice: before pressing Connect, which is what decides\nwhether there is anything to send, and again after the invitation window\nclosed, which is the verification. An invitation that went out shows as\n``invitation_pending`` on re-reading; a re-reading that shows Connect back\non offer is a failure, whatever the window did.\n\n``member_urn`` is the load-bearing field: without it the invitation ledger\nrow never opens and acceptance detection has nothing to match. Whether a\nnote went with the invitation is the step's own ``note``: the browser\nsends exactly what it was handed or fails rather than send less, and how\nfar a failed attempt got is the row's error message. The one exception is\n``sent_without_note``: True when LinkedIn sent the invitation the moment\nConnect was pressed, with no window to write the note in. The invitation\nexists, so the step succeeded; the note it was handed did not go with it.\nNone whenever the note went (or there was none to send). Not ``note_sent``:\nthat key was retired, and the release task strips it from stored rows.","properties":{"already_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Connected"},"already_following":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Following"},"can_send_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Send Message"},"found_already":{"anyOf":[{"$ref":"#/components/schemas/LinkedInFoundAlready"},{"type":"null"}]},"invitation_pending":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invitation Pending"},"kind":{"const":"connection_request","default":"connection_request","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"member_urns":{"items":{"maxLength":128,"type":"string"},"maxItems":8,"title":"Member Urns","type":"array"},"open_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Open Profile"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"profile_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Profile Resolved"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"sent_without_note":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sent Without Note"},"vanity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity"}},"title":"ConnectionRequestOutcome","type":"object"},"ConnectionRequestParams":{"additionalProperties":false,"description":"Send an invitation, with or without a note.\n\n``profile_url`` is where the browser goes first. ``note`` is what the\nbrowser types, already clipped to LinkedIn's ceiling on a word boundary.\n``note_original_length`` is how long the rendered note was before clipping,\nthe one number nothing can recover once the text is gone, so history can\nsay who lost text and how much. Whether it was cut follows from the two and\nis not stored beside them.","properties":{"kind":{"const":"connection_request","default":"connection_request","title":"Kind","type":"string"},"note":{"default":"","maxLength":300,"title":"Note","type":"string"},"note_original_length":{"default":0,"minimum":0.0,"title":"Note Original Length","type":"integer"},"profile_url":{"maxLength":512,"title":"Profile Url","type":"string"}},"required":["profile_url"],"title":"ConnectionRequestParams","type":"object"},"ContactFieldReadSchema":{"description":"One filled column of the contact's audience row: its header and its text.","properties":{"name":{"title":"Name","type":"string"},"value":{"title":"Value","type":"string"}},"required":["name","value"],"title":"ContactFieldReadSchema","type":"object"},"ContactGroup":{"description":"The Audience tab's tab a contact sits under; every contact is under one.\n\nThe tabs used to be counts that overlapped (a bounced contact was both\n\"reachable\" and \"blocked\", so the counts added up past the roster) and\nopened a list of names over the roster they repeated (Natsuki,\n2026-10-02). They partition the roster now and filter it in place, so a\ntab's count is exactly the rows it shows, and each row's own status chip\nnames the state that put it there.\n\nDerived at read time from the status, the stop reason, the contact's\ncurrent-step task and whether an address reaches them, never stored.","enum":["in_progress","needs_approval","paused","done","blocked"],"title":"ContactGroup","type":"string"},"ContactGroupCountsReadSchema":{"description":"How many contacts sit under each of the Audience tab's tabs; they add up to ``checked``.","properties":{"blocked":{"description":"Cannot go on: no address reaches them, do not contact, in another sequence, contacted too recently, bounced, their mailbox removed, or a step that stopped on an error.","title":"Blocked","type":"integer"},"done":{"description":"Nothing left to do: finished, replied, unsubscribed, stopped or removed, or found already connected by a Withdraw.","title":"Done","type":"integer"},"in_progress":{"description":"Still in the cadence; a draft's roster, which the tab names Not started.","title":"In Progress","type":"integer"},"needs_approval":{"description":"A message waiting on the customer's approval.","title":"Needs Approval","type":"integer"},"paused":{"description":"Paused by hand, or in the cadence of a paused sequence.","title":"Paused","type":"integer"}},"required":["in_progress","needs_approval","paused","done","blocked"],"title":"ContactGroupCountsReadSchema","type":"object"},"ContactHistoryEntryReadSchema":{"description":"One thing this sequence did to one contact.","properties":{"at":{"format":"date-time","title":"At","type":"string"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The email's words as they were sent, without the signature and opt-out footer the send added below them (`email_html` has the whole email), or the text of the contact's reply (trimmed, and cut short past about a thousand characters).","title":"Body"},"decided_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Decided At"},"decided_by_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who decided, as a name. Null when nobody was asked, or when the channel recorded a decision without saying who made it.","title":"Decided By Display Name"},"decision":{"anyOf":[{"enum":["approved","rejected"],"type":"string"},{"type":"null"}],"description":"What a person decided about this step from the approval queue, if asked.","title":"Decision"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The email's subject, the LinkedIn message, or nothing.","title":"Detail"},"email_html":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"An email's HTML part exactly as it was handed to Gmail: the words, the sender's signature and the opt-out footer, every line, blank line and space as the contact got them. Null for a send from before the send kept its email, and on every entry that is not an email.","title":"Email Html"},"entered_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the contact reached this step, as distinct from when it ran. The gap between the two is the step's wait.","title":"Entered At"},"kind":{"$ref":"#/components/schemas/ContactHistoryKind"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"One plain sentence to show under the outcome where it needs saying, such as which address cannot receive email on a bounce.","title":"Note"},"outcome":{"description":"accepted/failed for a send, or bounced on the email a bounce came back for; the action's own status for LinkedIn; skipped for an email or LinkedIn step the contact was moved past without it being done, with note saying why; yes/no for a condition, and the branch taken (connected, already_connected, not_accepted) for a connection request's answer; replied for the contact's reply.","title":"Outcome","type":"string"},"reason":{"anyOf":[{"$ref":"#/components/schemas/InviteOutcome"},{"type":"null"}],"description":"On a connection request's decision: why the contact took that branch (accepted, already_connected, expired, declined, or why no request could go out). note carries it as a sentence. Null on every other entry."},"spam_signals":{"description":"What the spam check said about this message as it went out, one sentence per finding. Empty when it raised nothing. A finding never held the send back; it is here so a reply that never came has an explanation to read.","items":{"type":"string"},"title":"Spam Signals","type":"array"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Step Id"},"step_name":{"title":"Step Name","type":"string"},"step_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The step's customer-visible ordinal, zero-based.","title":"Step Position"},"thread_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The inbox conversation this entry opens, on the reply entry. Null when the contact has no conversation in the inbox.","title":"Thread Id"}},"required":["at","kind","step_name","outcome"],"title":"ContactHistoryEntryReadSchema","type":"object"},"ContactHistoryKind":{"description":"What one entry in a contact's history is.","enum":["email","linkedin","condition","reply"],"title":"ContactHistoryKind","type":"string"},"ContactHistoryReadSchema":{"description":"A contact's whole history, oldest first, and what their audience row says about them.","properties":{"contact_fields":{"description":"Every filled column of the contact's audience row, in the table's order, as the approval queue shows them. Empty when there is no row to read.","items":{"$ref":"#/components/schemas/ContactFieldReadSchema"},"title":"Contact Fields","type":"array"},"entries":{"items":{"$ref":"#/components/schemas/ContactHistoryEntryReadSchema"},"title":"Entries","type":"array"},"upcoming_skip":{"anyOf":[{"$ref":"#/components/schemas/UpcomingSkipReadSchema"},{"type":"null"}],"description":"The step the contact waits on, when their row as it is today means it will be skipped once they reach it, and why. Null when it will run, or when nothing is ahead of them."}},"required":["entries","contact_fields"],"title":"ContactHistoryReadSchema","type":"object"},"ContactPromptChange":{"description":"A coordinated change to one existing prompt slot.","properties":{"current":{"title":"Current","type":"string"},"proposed":{"title":"Proposed","type":"string"},"rationale":{"title":"Rationale","type":"string"},"slot_key":{"title":"Slot Key","type":"string"}},"required":["slot_key","current","proposed","rationale"],"title":"ContactPromptChange","type":"object"},"ContactReviewVerdict":{"description":"Only an explicit review counts as feedback.","enum":["good","bad","skipped"],"title":"ContactReviewVerdict","type":"string"},"ContactTrainingProposal":{"description":"The session's candidate prompt update, kept pending until applied.","properties":{"changes":{"items":{"$ref":"#/components/schemas/ContactPromptChange"},"title":"Changes","type":"array"},"made_at":{"default":0,"title":"Made At","type":"integer"},"record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Record Id"},"round_ids":{"items":{"format":"uuid","type":"string"},"title":"Round Ids","type":"array"},"summary":{"title":"Summary","type":"string"}},"required":["summary"],"title":"ContactTrainingProposal","type":"object"},"ContactTrainingStatus":{"description":"A session's phase, also used to resume its review screen.","enum":["running","reviewing","proposing","proposed","completed","abandoned"],"title":"ContactTrainingStatus","type":"string"},"ContactsBreakdownReadSchema":{"description":"Added, in progress and finished, with every non-send cause visible.","properties":{"added":{"title":"Added","type":"integer"},"awaiting_action":{"default":0,"description":"Parked behind a task waiting on a person or a channel: an approval or a LinkedIn browser.","title":"Awaiting Action","type":"integer"},"cooldown":{"default":0,"description":"Stopped by the workspace's cooldown: reached by someone else recently.","title":"Cooldown","type":"integer"},"failed":{"title":"Failed","type":"integer"},"failed_retryable":{"default":0,"description":"The failed contacts Retry can do something for: every failure but a Withdraw that found the person already connected. Counted within failed, not beside it; what Retry all re-queues.","title":"Failed Retryable","type":"integer"},"finished":{"title":"Finished","type":"integer"},"in_progress":{"title":"In Progress","type":"integer"},"not_started":{"default":0,"description":"A draft's roster: contacts in the sequence and waiting on its launch (status pending). Not counted in in_progress.","title":"Not Started","type":"integer"},"out_of_office":{"default":0,"description":"Contacts 'Resume out-of-office' would bring back right now. Counted within the statuses above as well, not beside them.","title":"Out Of Office","type":"integer"},"paused":{"title":"Paused","type":"integer"},"skipped_duplicate":{"title":"Skipped Duplicate","type":"integer"},"stopped":{"title":"Stopped","type":"integer"},"suppressed":{"title":"Suppressed","type":"integer"}},"required":["added","in_progress","paused","finished","failed","stopped","suppressed","skipped_duplicate"],"title":"ContactsBreakdownReadSchema","type":"object"},"ContactsPerGroupReadSchema":{"description":"How the contacts a roster filter matches split across the Audience tab's tabs.","properties":{"capped":{"description":"More contacts match than one read judges, so each tab's count is at least that many.","title":"Capped","type":"boolean"},"groups":{"$ref":"#/components/schemas/ContactGroupCountsReadSchema","description":"How many of the matching contacts sit under each tab. Each one sits under exactly one, and list_sequence_contacts' 'group' with the same filters lists them."},"total":{"description":"Every contact the filters match: the All tab's count.","title":"Total","type":"integer"}},"required":["total","capped","groups"],"title":"ContactsPerGroupReadSchema","type":"object"},"ContentFilterSchema":{"description":"A text filter over the words a signal was drawn from, capped at 20 terms each way.","properties":{"exclude":{"items":{"type":"string"},"maxItems":20,"title":"Exclude","type":"array"},"include":{"items":{"type":"string"},"maxItems":20,"title":"Include","type":"array"}},"title":"ContentFilterSchema","type":"object"},"ConversationGrantsReadSchema":{"description":"What one conversation may apply without asking: the list, and where it comes from.\n\nRead for the shield in the chat header. ``follows_defaults`` tells the\nheader whether to show the list as the workspace's (change it in\nSettings) or as this thread's own (take one back here, or return to the\ndefaults). ``granted_tools`` is what the shield lists: the AI Assistant's\ncards are decided by tool, and the verbs decide only an agent's.","properties":{"follows_defaults":{"description":"Whether the list is the workspace defaults, read live. False once the conversation has a list of its own, which a change in Settings no longer reaches.","title":"Follows Defaults","type":"boolean"},"granted_tools":{"description":"The write operations the AI Assistant runs without asking in this conversation, in effect now: operation names as `GET /assistant/tools/` lists them, and `family:<area>` for the rest of one part of the product. Approving a card for this conversation adds its operation here. Only what still allows something is listed, by the name its operation has today.","items":{"type":"string"},"title":"Granted Tools","type":"array"},"granted_verbs":{"description":"The verbs this conversation applies without asking, in effect now.","items":{"$ref":"#/components/schemas/WorkspaceVerb"},"title":"Granted Verbs","type":"array"}},"required":["granted_verbs","granted_tools","follows_defaults"],"title":"ConversationGrantsReadSchema","type":"object"},"ConversationGrantsUpdateSchema":{"description":"Change a conversation's grant list, or hand it back to the workspace defaults.\n\nThe verbs and the operations are two halves of one list, and a field left\nout keeps its half exactly as it was.","properties":{"granted_tools":{"anyOf":[{"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":200,"type":"array"},{}],"description":"The write operations the AI Assistant may run without asking in this conversation. Send the current list minus one to take it back; an empty list allows none. A verb's name is ignored here.","title":"Granted Tools"},"granted_verbs":{"anyOf":[{"items":{"$ref":"#/components/schemas/WorkspaceVerb"},"maxItems":8,"type":"array"},{},{"type":"null"}],"description":"The verbs this conversation may apply without asking. Send the current list minus one verb to take that verb back. Send null to follow the workspace defaults again, operations included; an empty list allows nothing. A send is refused.","title":"Granted Verbs"}},"title":"ConversationGrantsUpdateSchema","type":"object"},"CooldownSettingsReadSchema":{"properties":{"is_suggested":{"description":"True when this is the suggested value for a workspace with no saved rule.","title":"Is Suggested","type":"boolean"},"person_cooldown_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Days during which a contacted person is not contacted again. Null is off.","title":"Person Cooldown Days"},"suggestion_pending":{"description":"True when the one-time suggested-default prompt has not been resolved.","title":"Suggestion Pending","type":"boolean"}},"required":["person_cooldown_days","is_suggested","suggestion_pending"],"title":"CooldownSettingsReadSchema","type":"object"},"CooldownSettingsUpdateSchema":{"properties":{"dismiss_suggestion":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Mark the one-time suggested-default prompt as resolved.","title":"Dismiss Suggestion"},"person_cooldown_days":{"anyOf":[{"maximum":365.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"title":"Person Cooldown Days"}},"title":"CooldownSettingsUpdateSchema","type":"object"},"CopilotOfferReadSchema":{"description":"Whether the composer should offer Co-pilot, and the count that earns it.","properties":{"offer":{"title":"Offer","type":"boolean"},"recent_draft_count":{"description":"Drafts this user asked for by hand in the last seven days.","title":"Recent Draft Count","type":"integer"}},"required":["offer","recent_draft_count"],"title":"CopilotOfferReadSchema","type":"object"},"CreateTableFromLeadSearchRequestSchema":{"description":"A search plus a new table to put its results in.","properties":{"backlinks":{"anyOf":[{"$ref":"#/components/schemas/BacklinksQuerySchema"},{"type":"null"}]},"companies":{"anyOf":[{"$ref":"#/components/schemas/CompanyQuerySchema"},{"type":"null"}]},"enrichments":{"description":"What to find out about the rows this search adds. Optional on a paid finder. Find People and Find Companies require at least one. Each becomes its own column, and each is billed per row that comes back with an answer.","items":{"$ref":"#/components/schemas/LeadEnrichmentOption"},"maxItems":4,"title":"Enrichments","type":"array"},"folder_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder to make the new table in, as when the search was started from inside one on the Tables list. Leave it out for the top level.","title":"Folder Id"},"hiring_companies":{"anyOf":[{"$ref":"#/components/schemas/HiringCompaniesQuerySchema"},{"type":"null"}]},"include_people_already_in_tables":{"default":false,"description":"A people search only. By default it leaves out the people who already have a row in one of the workspace's other tables, and keeps looking until enough new people are added; the response says how many it skipped. Set true to add them again.","title":"Include People Already In Tables","type":"boolean"},"local_businesses":{"anyOf":[{"$ref":"#/components/schemas/LocalBusinessQuerySchema"},{"type":"null"}]},"lookalikes":{"anyOf":[{"$ref":"#/components/schemas/LookalikeQuerySchema"},{"type":"null"}]},"people":{"anyOf":[{"$ref":"#/components/schemas/PeopleQuerySchema"},{"type":"null"}]},"post_authors":{"anyOf":[{"$ref":"#/components/schemas/PostAuthorsQuerySchema"},{"type":"null"}]},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"row_limit":{"anyOf":[{"maximum":1000000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Rows to add. Clamped further by the organisation's plan cap; omit for the maximum.","title":"Row Limit"},"search_results":{"anyOf":[{"$ref":"#/components/schemas/SearchResultsQuerySchema"},{"type":"null"}]},"signal_companies":{"anyOf":[{"$ref":"#/components/schemas/SignalCompaniesQuerySchema"},{"type":"null"}]},"signal_people":{"anyOf":[{"$ref":"#/components/schemas/SignalPeopleQuerySchema"},{"type":"null"}]},"table_name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"The new table's name. Omit it and the table is named after the search, the name `POST /find-leads/suggest-table-name/` gives.","title":"Table Name"}},"required":["record_type"],"title":"CreateTableFromLeadSearchRequestSchema","type":"object"},"CreateTableFromLeadSearchResponseSchema":{"description":"The table a search produced.","properties":{"earlier_table":{"anyOf":[{"$ref":"#/components/schemas/EarlierLeadTableSchema"},{"type":"null"}],"description":"A table the same search (the same filters) already built, when it still exists."},"enrichments_applied":{"description":"Chosen enrichments that became a column on the new table.","items":{"$ref":"#/components/schemas/LeadEnrichmentOption"},"title":"Enrichments Applied","type":"array"},"enrichments_skipped":{"description":"Chosen enrichments that could not run against the records this search returned. Leads with no LinkedIn URL cannot be enriched from one. The table is still created.","items":{"$ref":"#/components/schemas/LeadEnrichmentOption"},"title":"Enrichments Skipped","type":"array"},"import_status":{"$ref":"#/components/schemas/LeadSearchRunStatus","default":"success","description":"`running` when the request added a first batch and the rest is still being added in the background, so poll the table's search runs for progress; `success` when every row is in."},"people_skipped":{"default":0,"description":"People the request left out because another of the workspace's tables already has them. A run that continues in the background goes on skipping them.","title":"People Skipped","type":"integer"},"provider_notices":{"description":"What the data source said about the rows it sold, in its own words; see the preview response. Empty for every data source that attaches nothing.","items":{"type":"string"},"title":"Provider Notices","type":"array"},"rows_created":{"title":"Rows Created","type":"integer"},"rows_not_added":{"anyOf":[{"$ref":"#/components/schemas/RowsNotAddedSchema"},{"type":"null"}],"description":"The people the search found that are not rows, and why, once every row is in: `found_twice` when the people search holds one person under two records, so a new table took them once; `already_in_table` when a person found was already a row of the table. Null when every person found was added, or while rows are still being added."},"rows_wanted":{"default":0,"description":"Rows the import set out to add in all.","title":"Rows Wanted","type":"integer"},"run_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The run row recording this import, when the search is persisted.","title":"Run Id"},"skip_limit_reached":{"default":false,"description":"Whether the search stopped looking after skipping as many people as one search may, so fewer rows may be added than asked for.","title":"Skip Limit Reached","type":"boolean"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"table_name":{"title":"Table Name","type":"string"},"table_run_request_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The request for the table run that fills the new table's columns, when every row was added by this request: the run is minted with it as its origin. Null while rows are still being added in the background, where each batch fills its own.","title":"Table Run Request Id"},"total_matched":{"title":"Total Matched","type":"integer"}},"required":["table_id","table_name","rows_created","total_matched"],"title":"CreateTableFromLeadSearchResponseSchema","type":"object"},"CreateTableFromSourceRequestSchema":{"description":"What to import, and into a table called what.","properties":{"folder_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder to make the table in, as when the import starts from inside one on the Tables list. Leave it out for the top level.","title":"Folder Id"},"identity_field":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Which id key to match rows on, one of the preview's identity_field_choices. Null takes the preview's recommended identity_field. A key some records lack, or one records share, is refused.","title":"Identity Field"},"integration_id":{"description":"The connected integration to import from.","format":"uuid","title":"Integration Id","type":"string"},"promote_paths":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"Fields to give their own column, in this order. Null uses the preview's suggestions; an empty list promotes nothing. Unknown paths are skipped; the table's column limit is the only ceiling.","title":"Promote Paths"},"record_type":{"description":"Which object to import.","maxLength":255,"minLength":1,"title":"Record Type","type":"string"},"row_limit":{"anyOf":[{"exclusiveMinimum":0.0,"maximum":2147483647.0,"type":"integer"},{"type":"null"}],"description":"Most rows one run may pull; null for everything. A limited source can never sweep deletions: it cannot tell a record it chose not to fetch from one that is gone.","title":"Row Limit"},"table_name":{"description":"Name for the new table.","maxLength":255,"minLength":1,"title":"Table Name","type":"string"}},"required":["integration_id","record_type","table_name"],"title":"CreateTableFromSourceRequestSchema","type":"object"},"CreateTableFromSourceResponseSchema":{"description":"The table that now exists, and the run filling it.","properties":{"run":{"$ref":"#/components/schemas/TableSourceRunSchema"},"source":{"$ref":"#/components/schemas/TableSourceSchema"},"table_id":{"description":"Navigate here immediately; rows arrive behind you.","format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","source","run"],"title":"CreateTableFromSourceResponseSchema","type":"object"},"CreateTableFromSubdomainSearchRequestSchema":{"description":"Turn a finished search into a table.","properties":{"folder_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder to make the table in, as when the search is started from inside one on the Tables list. Leave it out for the top level.","title":"Folder Id"},"search_id":{"format":"uuid","title":"Search Id","type":"string"},"table_name":{"maxLength":255,"minLength":1,"title":"Table Name","type":"string"}},"required":["search_id","table_name"],"title":"CreateTableFromSubdomainSearchRequestSchema","type":"object"},"CreateTableFromSubdomainSearchResponseSchema":{"description":"The table a search was turned into.","properties":{"hostnames_found":{"description":"What the search found, before any cap. Larger than rows_created when the per-search cap trimmed what was stored or the organisation's per-table row limit clamped the landing.","title":"Hostnames Found","type":"integer"},"rows_created":{"title":"Rows Created","type":"integer"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"table_name":{"title":"Table Name","type":"string"}},"required":["table_id","table_name","rows_created","hostnames_found"],"title":"CreateTableFromSubdomainSearchResponseSchema","type":"object"},"CreateTableScheduleRequestSchema":{"description":"Set up a table's refresh cadence.","properties":{"delete_missing_rows":{"default":false,"description":"Delete rows whose records have gone from the source. Forces every scheduled run to re-list everything, and is capped per run so a provider outage cannot empty the table.","title":"Delete Missing Rows","type":"boolean"},"frequency":{"$ref":"#/components/schemas/TableScheduleFrequency","description":"A preset, or 'custom' for an interval."},"hour":{"default":9,"description":"Local hour to run at.","maximum":23.0,"minimum":0.0,"title":"Hour","type":"integer"},"interval_unit":{"anyOf":[{"$ref":"#/components/schemas/TableScheduleIntervalUnit"},{"type":"null"}],"description":"Required for a custom cadence."},"interval_value":{"anyOf":[{"exclusiveMinimum":0.0,"maximum":365.0,"type":"integer"},{"type":"null"}],"description":"Required for a custom cadence.","title":"Interval Value"},"minute":{"default":0,"description":"Local minute to run at.","maximum":59.0,"minimum":0.0,"title":"Minute","type":"integer"},"time_zone":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"IANA zone the time is in; defaults to UTC. An unknown zone falls back to UTC.","title":"Time Zone"}},"required":["frequency"],"title":"CreateTableScheduleRequestSchema","type":"object"},"CreditAttributionEntitySchema":{"description":"One attribution entity (table or provider) with its drill-down rows.","properties":{"avg_cost_per_unit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Cost Per Unit"},"credits_refunded":{"description":"Refunded portion, reported separately, in decimal credits.","title":"Credits Refunded","type":"number"},"credits_spent":{"description":"Net of any refunds sharing this attribution, in decimal credits.","title":"Credits Spent","type":"number"},"deleted":{"default":false,"description":"True when a table id no longer resolves to a live table. The row is kept so the credits stay accounted for, but the client must render the name as plain text rather than a link to a table that is gone.","title":"Deleted","type":"boolean"},"entry_count":{"title":"Entry Count","type":"integer"},"id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Table id for table grouping; null otherwise.","title":"Id"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider key for provider grouping; null otherwise.","title":"Key"},"name":{"description":"Resolved display name.","title":"Name","type":"string"},"subentities":{"description":"Drill-down rows sorted by credits descending.","items":{"$ref":"#/components/schemas/CreditAttributionSubentitySchema"},"title":"Subentities","type":"array"},"units":{"title":"Units","type":"integer"}},"required":["id","key","name","credits_spent","credits_refunded","units","entry_count","avg_cost_per_unit","subentities"],"title":"CreditAttributionEntitySchema","type":"object"},"CreditAttributionResponseSchema":{"description":"Credit spend attributed to tables/columns or providers/accounts.","properties":{"entities":{"description":"Sorted by credits descending; includes an explicit unattributed entity.","items":{"$ref":"#/components/schemas/CreditAttributionEntitySchema"},"title":"Entities","type":"array"},"subentity_breakdown_since":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Drill-down rows cover only the detailed window when the range crosses the rollup boundary.","title":"Subentity Breakdown Since"},"total_credits_refunded":{"description":"The organization refunded total row, in decimal credits.","title":"Total Credits Refunded","type":"number"},"total_credits_spent":{"description":"The organization total row, net of refunds, in decimal credits.","title":"Total Credits Spent","type":"number"},"unattributed_credits":{"description":"In decimal credits.","title":"Unattributed Credits","type":"number"}},"required":["entities","unattributed_credits","total_credits_spent","total_credits_refunded","subentity_breakdown_since"],"title":"CreditAttributionResponseSchema","type":"object"},"CreditAttributionSubentitySchema":{"description":"One drill-down row within an attribution entity (column / account).","properties":{"avg_cost_per_unit":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"credits_spent / units, in decimal credits; null when units is zero.","title":"Avg Cost Per Unit"},"credits_refunded":{"description":"Refunded portion, reported separately, in decimal credits.","title":"Credits Refunded","type":"number"},"credits_spent":{"description":"Net of any refunds sharing this attribution, in decimal credits.","title":"Credits Spent","type":"number"},"entry_count":{"title":"Entry Count","type":"integer"},"id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Column or integration id; null when unattributed.","title":"Id"},"name":{"description":"Resolved display name.","title":"Name","type":"string"},"units":{"description":"Count of items charged.","title":"Units","type":"integer"}},"required":["id","name","credits_spent","credits_refunded","units","entry_count","avg_cost_per_unit"],"title":"CreditAttributionSubentitySchema","type":"object"},"CreditBalancePointSchema":{"description":"The credit balance at the end of one time bucket.","properties":{"balance":{"description":"In decimal credits.","title":"Balance","type":"number"},"bucket_start":{"format":"date-time","title":"Bucket Start","type":"string"}},"required":["bucket_start","balance"],"title":"CreditBalancePointSchema","type":"object"},"CreditBalanceSummarySchema":{"description":"The global credit meter: credits left, allowance, period, and flags.","properties":{"available":{"description":"Credits left to spend: the balance, floored at zero, in decimal credits. A running table's hold does not lower it.","title":"Available","type":"number"},"balance":{"description":"Settled credit balance, in decimal credits.","title":"Balance","type":"number"},"held":{"description":"Credits in-flight runs set aside for their highest possible cost, in decimal credits. Still part of the balance until charged, so it does not lower the credits left.","title":"Held","type":"number"},"is_blocked":{"description":"The balance is empty; credit-consuming work is refused.","title":"Is Blocked","type":"boolean"},"is_low":{"description":"The balance is at or below the low-balance threshold.","title":"Is Low","type":"boolean"},"period_allowance":{"description":"Credits granted each period by the plan, in decimal credits.","title":"Period Allowance","type":"number"},"period_end":{"description":"When the allowance next refills.","format":"date-time","title":"Period End","type":"string"},"period_start":{"description":"Start of the current grant period.","format":"date-time","title":"Period Start","type":"string"}},"required":["balance","held","available","period_allowance","period_start","period_end","is_low","is_blocked"],"title":"CreditBalanceSummarySchema","type":"object"},"CreditBalanceTimeseriesResponseSchema":{"description":"The balance-over-time series for the usage overview chart.","properties":{"buckets":{"description":"Zero-gap series; the last known balance carries through empty buckets.","items":{"$ref":"#/components/schemas/CreditBalancePointSchema"},"title":"Buckets","type":"array"},"clamped_start":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Set when the requested start predated the detail boundary and the series was clamped.","title":"Clamped Start"},"interval":{"description":"Bucket size as served: hour or day.","title":"Interval","type":"string"}},"required":["interval","buckets","clamped_start"],"title":"CreditBalanceTimeseriesResponseSchema","type":"object"},"CreditColumnUsageSchema":{"description":"Per-column credit usage for one table.","properties":{"avg_cost_per_cell":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"credits / cells, in decimal credits; null at zero cells.","title":"Avg Cost Per Cell"},"cell_count":{"title":"Cell Count","type":"integer"},"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Column Id"},"credits_refunded":{"description":"Refunded portion, reported separately, in decimal credits.","title":"Credits Refunded","type":"number"},"credits_spent":{"description":"Net of any refunds attributed to this column, in decimal credits.","title":"Credits Spent","type":"number"},"name":{"description":"Resolved column name; 'Deleted column' when unresolvable.","title":"Name","type":"string"}},"required":["column_id","name","cell_count","avg_cost_per_cell","credits_spent","credits_refunded"],"title":"CreditColumnUsageSchema","type":"object"},"CreditEntryKind":{"description":"The kind of a credit ledger entry.","enum":["grant","expiry","pack_purchase","charge","refund","referral","adjustment"],"title":"CreditEntryKind","type":"string"},"CreditExportReport":{"description":"Which usage report a CSV export serves.","enum":["balance_timeseries","spend_timeseries","by_table","by_provider","by_agent","table_timeseries","table_by_column","table_by_run","ledger"],"title":"CreditExportReport","type":"string"},"CreditLedgerEntrySchema":{"description":"One immutable credit ledger entry.","properties":{"amount":{"description":"Signed credits; charges are negative. In decimal credits.","title":"Amount","type":"number"},"balance_after":{"description":"In decimal credits.","title":"Balance After","type":"number"},"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Column Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"entry_kind":{"$ref":"#/components/schemas/CreditEntryKind"},"id":{"format":"uuid","title":"Id","type":"string"},"integration_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Integration Id"},"occurred_at":{"format":"date-time","title":"Occurred At","type":"string"},"provider_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Key"},"run_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Run Id"},"table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Table Id"},"unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"In decimal credits.","title":"Unit Price"},"units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Units"}},"required":["id","entry_kind","amount","balance_after","occurred_at","description","table_id","column_id","run_id","provider_key","integration_id","units","unit_price"],"title":"CreditLedgerEntrySchema","type":"object"},"CreditPackCheckoutRequestSchema":{"description":"Request schema for starting a one-time credit pack purchase.","properties":{"cancel_path":{"description":"Partial path (e.g. /billing) of where the stripe Checkout session should redirect the user if payment is cancelled.","maxLength":255,"minLength":1,"title":"Cancel Path","type":"string"},"credits":{"description":"The number of credits to purchase.","maximum":100000000.0,"minimum":1.0,"title":"Credits","type":"integer"},"success_path":{"description":"Partial path (e.g. /billing) of where the stripe Checkout session should redirect the user if payment is successful.","maxLength":255,"minLength":1,"title":"Success Path","type":"string"}},"required":["credits","success_path","cancel_path"],"title":"CreditPackCheckoutRequestSchema","type":"object"},"CreditPackCheckoutResponseSchema":{"description":"Response schema for a started credit pack purchase.","properties":{"checkout_url":{"description":"The URL to redirect the customer to complete the payment.","format":"uri","maxLength":2083,"minLength":1,"title":"Checkout Url","type":"string"}},"required":["checkout_url"],"title":"CreditPackCheckoutResponseSchema","type":"object"},"CreditPackQuoteReadSchema":{"description":"Response schema for the credit pack quote and purchase limits.","properties":{"amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The total price in cents for the requested credit amount. None when no amount was requested.","title":"Amount Cents"},"max_credits":{"description":"Maximum purchasable credits in a single pack.","title":"Max Credits","type":"integer"},"min_credits":{"description":"Minimum purchasable credits per pack.","title":"Min Credits","type":"integer"},"preset_credits":{"description":"Suggested pack sizes for the purchase dialog.","items":{"type":"integer"},"title":"Preset Credits","type":"array"},"unit_amount_decimal_per_credit":{"description":"Price per credit in cents (decimal string, e.g. '0.4').","title":"Unit Amount Decimal Per Credit","type":"string"}},"required":["unit_amount_decimal_per_credit","min_credits","max_credits","preset_credits","amount_cents"],"title":"CreditPackQuoteReadSchema","type":"object"},"CreditPriceAiTierReadSchema":{"description":"One selectable AI tier and what it costs per operation.","properties":{"ai_writing_credits":{"description":"The most one generated piece of copy costs: the tier's base, for ONE completion, not a whole sequence.","title":"Ai Writing Credits","type":"number"},"company_research_credits":{"description":"The most one researched record costs when the agent may browse the web: the tier's base plus its web-research add-on. A record is charged what its research used, never more.","title":"Company Research Credits","type":"number"},"display_name":{"description":"The tier's user-facing effort name, e.g. 'Medium'.","title":"Display Name","type":"string"},"key":{"description":"The model catalog key, e.g. 'core'.","title":"Key","type":"string"}},"required":["key","display_name","company_research_credits","ai_writing_credits"],"title":"CreditPriceAiTierReadSchema","type":"object"},"CreditPricesReadSchema":{"description":"The published unit prices behind the plan page's usage calculator.\n\nEvery figure is read from what the charge sites bill, converted to decimal\ncredits at this boundary, so a quote can never drift from a bill. A\nwaterfall's figure is what an answered row usually costs: each row is\ncharged the price of the provider that answered it.","properties":{"ai_tiers":{"description":"The AI tiers, cheapest first.","items":{"$ref":"#/components/schemas/CreditPriceAiTierReadSchema"},"title":"Ai Tiers","type":"array"},"cents_per_credit":{"description":"The dollar value of one credit, in cents.","title":"Cents Per Credit","type":"number"},"find_email_credits":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Expected credits to find one work email across the provider waterfall. Only the winning provider bills. None when this deployment has no email-finding provider registered.","title":"Find Email Credits"},"find_phone_credits":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Expected credits to find one direct phone number across the provider waterfall. Only the winning provider bills. None when this deployment has no phone-finding provider registered.","title":"Find Phone Credits"},"send_email_credits":{"description":"Credits per accepted outbound send. Failed sends never bill.","title":"Send Email Credits","type":"number"},"verify_email_credits":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Expected credits to verify one email address across the provider waterfall. None when no verification provider is registered.","title":"Verify Email Credits"}},"required":["cents_per_credit","ai_tiers","find_email_credits","find_phone_credits","verify_email_credits","send_email_credits"],"title":"CreditPricesReadSchema","type":"object"},"CreditRunUsageSchema":{"description":"Per-run credit usage for one table.","properties":{"column_count":{"title":"Column Count","type":"integer"},"credits_spent":{"description":"In decimal credits.","title":"Credits Spent","type":"number"},"description":{"description":"Server-composed summary, e.g. '10 cells across 1 column'.","title":"Description","type":"string"},"run_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Run Id"},"run_started_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The run's start time when resolvable, else the first charge time.","title":"Run Started At"},"units":{"title":"Units","type":"integer"}},"required":["run_id","run_started_at","description","units","column_count","credits_spent"],"title":"CreditRunUsageSchema","type":"object"},"CreditSpendBucketSchema":{"description":"Credits spent within one time bucket.","properties":{"bucket_start":{"format":"date-time","title":"Bucket Start","type":"string"},"credits_refunded":{"description":"Refunded portion of the bucket, reported separately from credits_spent. 0 for rollup-granularity buckets (refunds are not broken out beyond the detail retention window). In decimal credits.","title":"Credits Refunded","type":"number"},"credits_spent":{"description":"Net of any refunds in the bucket, in decimal credits.","title":"Credits Spent","type":"number"},"units":{"description":"Items (cells) charged in the bucket.","title":"Units","type":"integer"}},"required":["bucket_start","credits_spent","credits_refunded","units"],"title":"CreditSpendBucketSchema","type":"object"},"CreditSpendTimeseriesResponseSchema":{"description":"The credits-spent series for the usage overview chart.","properties":{"buckets":{"items":{"$ref":"#/components/schemas/CreditSpendBucketSchema"},"title":"Buckets","type":"array"},"interval":{"description":"Bucket size of the detailed part: hour or day.","title":"Interval","type":"string"},"reduced_granularity_before":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Buckets before this boundary are month-granularity rollups.","title":"Reduced Granularity Before"},"total_credits_refunded":{"description":"Headline refunded total for the range, in decimal credits.","title":"Total Credits Refunded","type":"number"},"total_credits_spent":{"description":"Headline total for the range, net of refunds, in decimal credits.","title":"Total Credits Spent","type":"number"},"total_units":{"title":"Total Units","type":"integer"}},"required":["interval","buckets","total_credits_spent","total_credits_refunded","total_units","reduced_granularity_before"],"title":"CreditSpendTimeseriesResponseSchema","type":"object"},"CreditTableUsageByColumnResponseSchema":{"description":"Per-column credit usage for one table.","properties":{"columns":{"description":"Sorted by credits descending.","items":{"$ref":"#/components/schemas/CreditColumnUsageSchema"},"title":"Columns","type":"array"},"total_credits_refunded":{"description":"In decimal credits.","title":"Total Credits Refunded","type":"number"},"total_credits_spent":{"description":"In decimal credits.","title":"Total Credits Spent","type":"number"}},"required":["columns","total_credits_spent","total_credits_refunded"],"title":"CreditTableUsageByColumnResponseSchema","type":"object"},"CreditTableUsageByRunResponseSchema":{"description":"Per-run credit usage for one table, newest first.","properties":{"runs":{"items":{"$ref":"#/components/schemas/CreditRunUsageSchema"},"title":"Runs","type":"array"},"total_credits_spent":{"description":"In decimal credits.","title":"Total Credits Spent","type":"number"},"truncated":{"description":"True when more runs matched than the cap; narrow the range.","title":"Truncated","type":"boolean"}},"required":["runs","total_credits_spent","truncated"],"title":"CreditTableUsageByRunResponseSchema","type":"object"},"CreditUsageMetaSchema":{"description":"Boundaries of the usage history the reporting endpoints can serve.","properties":{"detail_since":{"description":"Ranges before this boundary are served from monthly rollups (or clamped).","format":"date-time","title":"Detail Since","type":"string"},"history_starts_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Earliest moment any usage data exists; null when no data yet.","title":"History Starts At"}},"required":["history_starts_at","detail_since"],"title":"CreditUsageMetaSchema","type":"object"},"CurrencyOptions":{"description":"Options for a currency column.","properties":{"currency_code":{"default":"USD","description":"ISO-4217 code. Per column, not per cell: a column is denominated once.","maxLength":3,"minLength":3,"title":"Currency Code","type":"string"},"precision":{"default":2,"description":"Digits kept after the point. A number written into the column (typed, pasted, imported or sent through the API) is rounded to them, half away from zero: 2.005 at 2 places is stored as 2.01. A formula, AI or enrichment value keeps every digit and only shows this many. Changing it later changes how existing values show, never the values themselves.","maximum":10.0,"minimum":0.0,"title":"Precision","type":"integer"},"type":{"const":"currency","default":"currency","title":"Type","type":"string"}},"title":"CurrencyOptions","type":"object"},"Cursor":{"description":"Cursor for pagination. Contains the last/first item value and the seek direction.\n\nCursor pagination is based on the value of the order_by field. The ID field is always used as a\ntie breaker.\n\nE.g.\n- On page 1\n  - next_page_cursor would be the value of the last item in the page. Seek is \"next\".\n  - previous_page_cursor would be None.\n- On page 2\n  - next_page_cursor would be the value of the last item in the page. Seek is \"next\".\n  - previous_page_cursor would be the value of the first item in the page. Seek is \"previous\".\n- On the last page, there would be previous_page_cursor and no next_page_cursor.\n  - next_page_cursor would be None.\n  - previous_page_cursor would be the value of the last item in the page. Seek is \"previous\".","properties":{"health_best_first":{"default":false,"title":"Health Best First","type":"boolean"},"health_first":{"default":false,"title":"Health First","type":"boolean"},"health_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health Rank"},"id":{"format":"uuid","title":"Id","type":"string"},"order_by":{"title":"Order By","type":"string"},"order_by_field_is_text":{"default":false,"title":"Order By Field Is Text","type":"boolean"},"order_by_field_value":{"anyOf":[{"format":"uuid","type":"string"},{"format":"date-time","type":"string"},{"type":"string"},{"type":"integer"},{"type":"boolean"}],"title":"Order By Field Value"},"seek":{"enum":["next","previous"],"title":"Seek","type":"string"}},"required":["order_by_field_value","id","order_by","seek"],"title":"Cursor","type":"object"},"DecimalOptions":{"description":"Options for a decimal column.","properties":{"precision":{"default":2,"description":"Digits kept after the point. A number written into the column (typed, pasted, imported or sent through the API) is rounded to them, half away from zero: 2.005 at 2 places is stored as 2.01. A formula, AI or enrichment value keeps every digit and only shows this many. Changing it later changes how existing values show, never the values themselves.","maximum":10.0,"minimum":0.0,"title":"Precision","type":"integer"},"type":{"const":"decimal","default":"decimal","title":"Type","type":"string"}},"title":"DecimalOptions","type":"object"},"DecimalRangeFilterSchema":{"description":"An inclusive fractional range; either bound may be omitted.\n\nSeparate from ``RangeFilterSchema`` rather than loosening it: the whole-\nnumber filters here count people, employees and reviews, and letting a\nfraction into one of those would generate a client type that says a\nheadcount can be 4.5.","properties":{"gte":{"anyOf":[{"minimum":0.0,"type":"number"},{"type":"null"}],"title":"Gte"},"lte":{"anyOf":[{"minimum":0.0,"type":"number"},{"type":"null"}],"title":"Lte"}},"title":"DecimalRangeFilterSchema","type":"object"},"DesignPartnerBadgeReadSchema":{"description":"One badge on the design partner page.","properties":{"awarded_at":{"description":"The date shown on the badge.","format":"date-time","title":"Awarded At","type":"string"},"description":{"description":"What this workspace's feedback made possible, in our words.","title":"Description","type":"string"},"icon":{"description":"Icon token for the frontend's curated set. An unrecognised token falls back to a default rather than breaking the page, so the set can grow without a backend release.","title":"Icon","type":"string"},"id":{"description":"The badge's ID.","format":"uuid","title":"Id","type":"string"},"title":{"description":"The badge's name.","title":"Title","type":"string"}},"required":["id","title","description","icon","awarded_at"],"title":"DesignPartnerBadgeReadSchema","type":"object"},"DesignPartnerFeedbackCreateSchema":{"description":"One submission from a member of a design partner workspace.","properties":{"body":{"description":"What they want to tell us. Free text, no categories, no form.","maxLength":5000,"minLength":1,"title":"Body","type":"string"}},"required":["body"],"title":"DesignPartnerFeedbackCreateSchema","type":"object"},"DesignPartnerFeedbackReadSchema":{"description":"One stored submission, as the workspace's own history shows it.\n\nThe whole workspace sees every member's submissions: the page is addressed\nto the organization, and a partner should be able to see what their\ncolleagues have already asked for rather than repeating it.","properties":{"badge_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The badge it led to, when it shipped. Null otherwise.","title":"Badge Id"},"body":{"description":"What they wrote.","title":"Body","type":"string"},"created_at":{"description":"When they wrote it.","format":"date-time","title":"Created At","type":"string"},"id":{"description":"The submission's ID.","format":"uuid","title":"Id","type":"string"},"status":{"anyOf":[{"$ref":"#/components/schemas/DesignPartnerFeedbackStatus"},{"type":"null"}],"description":"What our team did with it: 'seen', 'planned' or 'shipped', the furthest one reached. Null while nobody on our team has seen it."},"user_email":{"description":"Who wrote it, as their email was at the time they wrote it.","title":"User Email","type":"string"},"user_id":{"description":"Clerk user ID of who wrote it, so the page can show their name and tell the reader which submissions are their own.","title":"User Id","type":"string"}},"required":["id","user_id","user_email","body","created_at","status","badge_id"],"title":"DesignPartnerFeedbackReadSchema","type":"object"},"DesignPartnerFeedbackStatus":{"description":"What the partner's page says we did with one submission.","enum":["seen","planned","shipped"],"title":"DesignPartnerFeedbackStatus","type":"string"},"DesignPartnerSlackInviteCreateSchema":{"description":"The address a workspace wants its shared-channel invitation sent to.","properties":{"email":{"description":"Where Slack sends the invitation. Typed by the caller rather than taken from their account, because the person who should be in the channel is not always the person setting it up.","format":"email","maxLength":320,"title":"Email","type":"string"}},"required":["email"],"title":"DesignPartnerSlackInviteCreateSchema","type":"object"},"DesignPartnerSlackReadSchema":{"description":"The workspace's shared Slack channel and its one invitation.\n\nBoth belong to the organization, so every member of a partner workspace\nreads the same block: the same channel, the same invitation, whoever sent\nit. A Slack Connect guest can invite their own colleagues, so the second\nperson through the door is Slack's job rather than ours.","properties":{"channel_failure_message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What to tell the reader when provisioning failed. Null otherwise.","title":"Channel Failure Message"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The channel's name, without the leading hash. Null until it is ready.","title":"Channel Name"},"channel_state":{"description":"Where the workspace's channel is. 'none' means nobody has sent an invite yet, which is what puts the form on the page. 'provisioning' is the run that creates it, which the page polls. 'failed' carries a sentence.","enum":["none","provisioning","ready","failed"],"title":"Channel State","type":"string"},"channel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A link that opens the channel in the reader's Slack. Null until it is ready.","title":"Channel Url"},"invite_can_send":{"description":"Whether to offer the form. False while a run is in flight, while the invitation that went out is still live at Slack, and after a refusal about our own Slack workspace's settings that no retry fixes. Decided here so the page holds no copy of the lifetime and no opinion about which refusals are worth another press.","title":"Invite Can Send","type":"boolean"},"invite_email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The address the invitation went to.","title":"Invite Email"},"invite_message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What to tell the reader when Slack refused, already written for a person rather than a log. Null when nothing was refused.","title":"Invite Message"},"invite_sent_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When Slack accepted the invitation.","title":"Invite Sent At"},"invite_status":{"description":"What became of the workspace's invitation.","enum":["none","sent","refused"],"title":"Invite Status","type":"string"}},"required":["channel_state","channel_failure_message","channel_name","channel_url","invite_status","invite_email","invite_sent_at","invite_message","invite_can_send"],"title":"DesignPartnerSlackReadSchema","type":"object"},"DesignPartnerStatusReadSchema":{"description":"Whether the caller's workspace is a design partner, and its badges.\n\nOne read for three consumers (the sidebar item, the route guard and the\npage), so a workspace that is not a partner costs exactly one cheap query\nper session rather than three.","properties":{"badges":{"description":"The workspace's badges, newest award first. Empty both for non-partners and for partners nobody has written a badge for yet. The page says so plainly rather than hiding the section.","items":{"$ref":"#/components/schemas/DesignPartnerBadgeReadSchema"},"title":"Badges","type":"array"},"is_design_partner":{"description":"Whether the caller's workspace is a design partner.","title":"Is Design Partner","type":"boolean"},"slack":{"anyOf":[{"$ref":"#/components/schemas/DesignPartnerSlackReadSchema"},{"type":"null"}],"description":"The shared Slack channel block. Null for a workspace that is not a design partner, and null when this deployment has no Slack workspace configured. The page hides the section rather than offering a button that cannot work."},"started_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Partner since. Null when the workspace is not a design partner.","title":"Started At"}},"required":["is_design_partner","started_at","badges","slack"],"title":"DesignPartnerStatusReadSchema","type":"object"},"DetachedLeadSearchResponseSchema":{"description":"What removing a table's search did to the rows it had added.","properties":{"rows_deleted":{"description":"Rows deleted with the search; 0 when its rows were kept.","title":"Rows Deleted","type":"integer"}},"required":["rows_deleted"],"title":"DetachedLeadSearchResponseSchema","type":"object"},"DevEchoSettings":{"description":"Settings for the development-only echo action.\n\nThe delay is configurable so pipeline tests can run fast; the action's\ndisplay name promises one second, which is the default.","properties":{"delay_ms":{"default":1000,"maximum":60000.0,"minimum":0.0,"title":"Delay Ms","type":"integer"},"kind":{"const":"dev_echo","default":"dev_echo","title":"Kind","type":"string"}},"title":"DevEchoSettings","type":"object"},"DevFlakySettings":{"description":"Settings for the development-only intermittent-failure action.\n\nFailures are deterministic PER ROW: whether a given row fails is a pure\nfunction of the seed and the row's identity, so a failing row fails\nidentically on every run, which is what makes retry policy, partial\nfailure and the errored re-run scope testable at all. Changing the seed\nchanges WHICH rows fail.","properties":{"error_class":{"$ref":"#/components/schemas/EnrichmentErrorClass","default":"provider_error","description":"The error class every failing row reports."},"failure_rate":{"default":0.5,"description":"The fraction of rows that fail.","maximum":1.0,"minimum":0.0,"title":"Failure Rate","type":"number"},"kind":{"const":"dev_flaky","default":"dev_flaky","title":"Kind","type":"string"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Varies which rows fail; None derives purely from row identity.","title":"Seed"}},"title":"DevFlakySettings","type":"object"},"DoNotContactImpactReadSchema":{"properties":{"sequence_names":{"items":{"type":"string"},"title":"Sequence Names","type":"array"}},"required":["sequence_names"],"title":"DoNotContactImpactReadSchema","type":"object"},"DoNotContactResponseSchema":{"properties":{"stopped":{"description":"How many live enrolments were stopped with it.","title":"Stopped","type":"integer"}},"required":["stopped"],"title":"DoNotContactResponseSchema","type":"object"},"DomainDelegationStatus":{"description":"Where a Google Workspace domain stands in the delegation handshake.\n\nPENDING means we know the domain but have not asked InboxKit to register\nour client id yet; AUTHORIZING means their async request is in flight;\nAUTHORIZED means minting tokens for that domain's mailboxes works; FAILED\ncarries a reason and is retryable (a new import attempt re-initiates).","enum":["pending","authorizing","authorized","failed"],"title":"DomainDelegationStatus","type":"string"},"DraftRating":{"description":"The human verdict on a drafted reply.\n\nTwo values, not five stars: a triaging human will click a thumb, not\ndeliberate over a scale, and \"good or bad\" is all a feedback loop needs.","enum":["good","bad"],"title":"DraftRating","type":"string"},"DrivePickerTokenReadSchema":{"description":"What the browser needs to open the Google Picker.","properties":{"access_token":{"description":"A short-lived token scoped to drive.file. Never store it.","title":"Access Token","type":"string"},"app_id":{"description":"The GCP project number, for PickerBuilder.setAppId.","title":"App Id","type":"string"},"developer_key":{"description":"The public browser API key, for PickerBuilder.setDeveloperKey.","title":"Developer Key","type":"string"},"expires_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Expires At"}},"required":["access_token","expires_at","app_id","developer_key"],"title":"DrivePickerTokenReadSchema","type":"object"},"EarlierLeadTableSchema":{"description":"A table the same search already built, found through the search history.","properties":{"built_at":{"description":"When that search built the table.","format":"date-time","title":"Built At","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"table_name":{"title":"Table Name","type":"string"}},"required":["table_id","table_name","built_at"],"title":"EarlierLeadTableSchema","type":"object"},"EditDraftSchema":{"properties":{"body_text":{"maxLength":20000,"minLength":1,"title":"Body Text","type":"string"},"subject":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"title":"Subject"}},"required":["body_text"],"title":"EditDraftSchema","type":"object"},"EffectiveApprovalReadSchema":{"description":"The mode that actually applies per channel, and which level set it.","properties":{"assigned_sender_send_modes":{"description":"Each sender assigned to the sequence, by name, with their own send mode as it applies in this sequence. Empty unless `sequence_id` is given.","items":{"$ref":"#/components/schemas/AssignedSenderSendModeReadSchema"},"title":"Assigned Sender Send Modes","type":"array"},"cadence_email_send_mode":{"anyOf":[{"$ref":"#/components/schemas/SenderSendMode"},{"type":"null"}],"description":"The send mode every email the sequence itself sends runs under: the strictest of its assigned senders', because its emails go out from every assigned sender's mailboxes in turn. `always_ask` when the sequence asks for approval or has no senders assigned. Null unless `sequence_id` is given."},"email_level":{"$ref":"#/components/schemas/ApprovalLevel","description":"Where the email mode came from: `sender` when they set one, `sequence` when a sequence demands a person, `default` when nobody has decided."},"email_mode":{"$ref":"#/components/schemas/ApprovalMode","description":"Whether email steps wait for a person (`manual`) or send on their own (`auto`). The older two-way setting; `email_send_mode` and `cadence_email_send_mode` say what actually happens to each email."},"email_send_mode":{"anyOf":[{"$ref":"#/components/schemas/SenderSendMode"},{"type":"null"}],"description":"The sender's own send mode, tightened to `always_ask` when the given sequence asks for approval. It decides the agent's replies from their mailboxes (in that sequence's conversations, when `sequence_id` is given); a sequence's own emails run under `cadence_email_send_mode` instead. `always_send` sends every email unless a check finds a problem in an agent-written one; `send_when_confident` also holds back the agent-written emails the agent is not confident in; `always_ask` has a person approve every email. Null unless `sender_profile_id` is given."},"linkedin_level":{"$ref":"#/components/schemas/ApprovalLevel","description":"Where the LinkedIn mode came from: `sender` when they set one, `sequence` when a sequence demands a person, `default` when nobody has decided."},"linkedin_mode":{"$ref":"#/components/schemas/ApprovalMode","description":"Whether LinkedIn steps wait for a person (`manual`) or run on their own (`auto`)."}},"required":["linkedin_mode","linkedin_level","email_mode","email_level","email_send_mode","cadence_email_send_mode","assigned_sender_send_modes"],"title":"EffectiveApprovalReadSchema","type":"object"},"EmailApprovalMode":{"description":"Whether a sender's email steps wait in the approval queue or send on their own.\n\nThe per-sender override of the workspace's email approval mode. The\nworkspace setting lives in the outreach-task domain, a layer above this\none, so this enum names only the two overrides a sender can carry; the\nabsence of one (``SenderProfileDTO.email_approval_mode`` is None) means\nthe sender follows the workspace.","enum":["manual","auto"],"title":"EmailApprovalMode","type":"string"},"EmailClosingReadSchema":{"description":"What a send adds below an email's words: the sender's signature, then the opt-out footer.","properties":{"opt_out_footer":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The sequence's opt-out footer, last of all, as the email carries it: its unsubscribe link written `[unsubscribe here](url)` in a formatted sequence and as the bare URL in a plain-text one. In a preview the link unsubscribes nobody. Null when the sequence has no footer.","title":"Opt Out Footer"},"signature":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The signature the email ends with, its sender variables filled in as the send fills them: the mailbox about to send, or else the first sender, the sender a preview writes as. Null when the sender has none.","title":"Signature"}},"required":["signature","opt_out_footer"],"title":"EmailClosingReadSchema","type":"object"},"EmailDeliverability":{"description":"The verdicts a Verify email column answers with, in the words its cells hold.\n\nThe ``verify_email`` chain respells every supplier's verdict onto exactly\nthese words (``email_verdict_canonical`` in ``table_enrichments``), so a\nsequence that reads the column compares its cells against them. Ordered\nfrom the safest to send to, which is the order the Audience tab lists them.","enum":["valid","catch-all","risky","unknown","invalid","disposable"],"title":"EmailDeliverability","type":"string"},"EmailStepColumnsSchema":{"description":"Which of a table's columns look like a written subject, first email and follow-ups.","properties":{"first_email_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A column holding the first email's body.","title":"First Email Column Id"},"follow_up_column_ids":{"description":"Columns holding follow-up bodies, in the order they send.","items":{"format":"uuid","type":"string"},"title":"Follow Up Column Ids","type":"array"},"subject_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A column holding a subject line.","title":"Subject Column Id"}},"title":"EmailStepColumnsSchema","type":"object"},"EmailVerificationEstimateReadSchema":{"description":"What verifying the audience's addresses would cover and cost, before it runs.","properties":{"adds_column":{"description":"True when that column does not exist yet and verifying adds it to the audience table first, over the sequence's email column. Adding it costs nothing.","title":"Adds Column","type":"boolean"},"balance_sufficient":{"description":"Whether the workspace's available credits cover the most it could cost.","title":"Balance Sufficient","type":"boolean"},"column_name":{"description":"The Verify email column the verdicts land in, by its name on the table.","title":"Column Name","type":"string"},"estimated_credits":{"description":"The most it could cost, in credits: every row priced in full.","title":"Estimated Credits","type":"number"},"expected_credits":{"description":"What it usually costs, in credits: each row is charged the price of the source that answered it, read from which sources usually answer. Quote it beside estimated_credits, never instead of it: up to estimated_credits, usually about this. When the two are equal the check has one price: then quote that one figure, without up to.","title":"Expected Credits","type":"number"},"maps_column":{"description":"True when the sequence does not read that column yet and verifying points its email deliverability at it, keeping the verdicts it emails.","title":"Maps Column","type":"boolean"},"rows":{"description":"Addresses it would verify: audience rows with an email that the Verify email column has not checked yet. The same number the launch check's `emails_not_verified` finding carries in `count`. Zero when every address already has a verdict and only the sequence has to read them.","title":"Rows","type":"integer"},"scope_too_large":{"description":"True when more addresses are unverified than one run may cover. Narrow the audience's view first; running is refused until then.","title":"Scope Too Large","type":"boolean"}},"required":["rows","expected_credits","estimated_credits","balance_sufficient","scope_too_large","column_name","adds_column","maps_column"],"title":"EmailVerificationEstimateReadSchema","type":"object"},"EmailVerificationRunReadSchema":{"description":"The run that is now verifying the audience's addresses.","properties":{"column_id":{"description":"The Verify email column the run fills in.","format":"uuid","title":"Column Id","type":"string"},"column_name":{"description":"That column's name on the table.","title":"Column Name","type":"string"},"rows":{"description":"Addresses the run is verifying.","title":"Rows","type":"integer"},"run":{"anyOf":[{"$ref":"#/components/schemas/TableRunReadSchema"},{"type":"null"}],"description":"The run, or null when there was nothing to verify or its start is still queued; the table's active runs pick it up either way."},"table_id":{"description":"The sequence's audience table.","format":"uuid","title":"Table Id","type":"string"}},"required":["rows","table_id","column_id","column_name","run"],"title":"EmailVerificationRunReadSchema","type":"object"},"EmployerRole":{"description":"Which of a person's jobs places them at an employer: the one held now, or one that ended.","enum":["current","past"],"title":"EmployerRole","type":"string"},"EnrichmentActionCatalogResponseSchema":{"description":"The enrichment actions available in this environment, in display order.","properties":{"actions":{"items":{"$ref":"#/components/schemas/EnrichmentActionSchema"},"title":"Actions","type":"array"}},"required":["actions"],"title":"EnrichmentActionCatalogResponseSchema","type":"object"},"EnrichmentActionCategory":{"description":"The section an enrichment action sits under in the picker.\n\nOrdered as the picker shows them. ``DEVELOPMENT`` exists so the dev-only\ntest actions render under their own clearly-labelled heading and can never\nbe mistaken for a product feature.","enum":["ai","web","workspace","enrichment","development"],"title":"EnrichmentActionCategory","type":"string"},"EnrichmentActionSchema":{"description":"One enrichment action as the picker renders it.","properties":{"category":{"$ref":"#/components/schemas/EnrichmentActionCategory","description":"The picker section this action sits under."},"column_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The noun a new column made from this action takes as its header. Separate from `display_name`, which sells the action in the picker and reads as a job ('Find a person's LinkedIn profile'), while a header names what the cells hold ('LinkedIn profile'). Null means the action never needed the distinction: a single-output action IS its output, so the frontend takes that output's name.","title":"Column Name"},"credentials":{"$ref":"#/components/schemas/ProviderCredentials","description":"Whose account this action's calls are billed to. 'platform' means we hold the credentials and charge credits for the row; 'customer' means it runs on the customer's own connected account and spends its quota, so the catalog quotes no credit price on the row."},"credits_per_row":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The action's own per-successful-row price in decimal credits, when it prices per action rather than per model: the price itself, or, when usual_credits_per_row is set, the most one row can cost. Surfaces as the cost label on catalog rows and in the editor; null means the price derives from the selected model.","title":"Credits Per Row"},"degraded":{"default":false,"description":"True when a waterfall currently has ZERO live suppliers: every rung's vendor is unprovisioned, out of quota, or holding a dead key. The picker greys the row with a reason so nobody buys into a tool that cannot answer any row right now. Always false for non-waterfall actions.","title":"Degraded","type":"boolean"},"description":{"description":"One line: what the action does.","title":"Description","type":"string"},"display_name":{"title":"Display Name","type":"string"},"family":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentFamily"},{"type":"null"}],"description":"The outcome shelf this action sits on WITHIN its category's tab: the second level under `category`, which picks the tab itself. Set on the data enrichments, whose tab is one long list authored by input ('Enrich person from email', '...from LinkedIn') and read by outcome; null on everything else, and on a stored waterfall filed under a value this deployment no longer knows."},"icon":{"description":"An icon token the frontend maps to an asset.","title":"Icon","type":"string"},"input_contract":{"description":"The settings kind this action accepts: what an action_settings payload must declare to configure it. Also how the editor knows the shape of the configuration: 'enrichment' binds every declared input to a column, 'column' binds exactly one and has no prompt at all, and everything else is prompt-driven.","title":"Input Contract","type":"string"},"inputs":{"description":"The facts this action needs supplied, each bound to a column. Empty for the prompt-driven actions. Several sources are checked behind one data enrichment and they need different facts, so binding a subset is normal there: it narrows which can run, it does not break the column. A 'column'-contract action declares exactly one, and it is the whole configuration.","items":{"$ref":"#/components/schemas/EnrichmentCanonicalFieldSchema"},"title":"Inputs","type":"array"},"key":{"description":"The registry key stored on enrichment column definitions.","title":"Key","type":"string"},"keywords":{"description":"Extra words the Tools search finds this action by, beyond its name and description: how a person describes the job ('follow up', 'pain point'). Authored per built-in agent in the catalog file; empty for everything else.","items":{"type":"string"},"title":"Keywords","type":"array"},"offers_second_check":{"default":false,"description":"Whether a column of this enrichment may turn on a second check (settings.second_check): Verify email sends a catch-all answer on to the next verifier. A column with it on can cost one more check per row, charged only when the second check gives a definite answer.","title":"Offers Second Check","type":"boolean"},"output_contract":{"description":"What the action produces: 'text' (one free-form value), 'structured' (obeys the column's declared output schema) or 'object' (a fixed object whose fields are this action's declared `outputs`, so nothing for a column to declare and no output builder). Consumers branch on THIS, never on the key.","title":"Output Contract","type":"string"},"outputs":{"description":"The facts this action can return. A data enrichment's output builder seeds from these; for an 'object'-contract action they ARE the output, fixed, and there is nothing to build.","items":{"$ref":"#/components/schemas/EnrichmentCanonicalFieldSchema"},"title":"Outputs","type":"array"},"pricing_key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The credit price-catalog key this action charges against; null is free.","title":"Pricing Key"},"provider_operation":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentProviderOperationSchema"},{"type":"null"}],"description":"For provider-category actions only: which integration operation this action fronts, with its typed inputs and outputs. The editor renders input bindings and default output fields from this. There is no per-provider frontend."},"refund_rules":{"description":"The action's declared refund promises: 'success_no_data' (an empty-handed success is free), 'success_blocked_data' (compliance-withheld data is free), 'success_preview_run' (previews are charged then refunded). The editor prints these so the promise is visible before running.","items":{"$ref":"#/components/schemas/EnrichmentRefundRule"},"title":"Refund Rules","type":"array"},"settings_fields":{"description":"The action's own configuration, field by field. One generic editor renders these, so an action with settings never waits for a frontend of its own.","items":{"$ref":"#/components/schemas/EnrichmentActionSettingFieldSchema"},"title":"Settings Fields","type":"array"},"shelf":{"anyOf":[{"$ref":"#/components/schemas/BuiltinAgentShelf"},{"type":"null"}],"description":"The Enrichment tab shelf a built-in agent is ALSO listed on ('research' or 'write'), after the data shelves. The agent stays on the Agent tab either way; null lists it there only, and is the answer for every action that is not a built-in agent."},"tagline":{"description":"A few words for the picker's meta line; empty falls back to the category word.","title":"Tagline","type":"string"},"usual_credits_per_row":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Set for an enrichment whose sources are priced differently: a row is charged the price of the source that answered it, never more than credits_per_row, and this is what an answered row usually costs, read from the platform's recent rows (Up to credits_per_row, usually about this). Null when the action has one price.","title":"Usual Credits Per Row"}},"required":["key","display_name","category","description","tagline","icon","pricing_key","input_contract","output_contract","credentials"],"title":"EnrichmentActionSchema","type":"object"},"EnrichmentActionSettingFieldSchema":{"description":"One configurable setting of an action, as the editor renders it.","properties":{"default":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Default"},"description":{"title":"Description","type":"string"},"display_name":{"title":"Display Name","type":"string"},"kind":{"description":"How to draw the control: 'text', 'textarea', 'number', 'boolean', 'select', 'key_value' (string map) or 'column' (a picker over this table's columns).","title":"Kind","type":"string"},"name":{"description":"The payload key this field writes.","title":"Name","type":"string"},"options":{"description":"Allowed values for a 'select' field.","items":{"type":"string"},"title":"Options","type":"array"},"required":{"default":false,"title":"Required","type":"boolean"},"secret":{"default":false,"description":"Render masked.","title":"Secret","type":"boolean"}},"required":["name","display_name","description","kind"],"title":"EnrichmentActionSettingFieldSchema","type":"object"},"EnrichmentAuditFieldChangeSchema":{"description":"A single field change in an edit.","properties":{"field":{"title":"Field","type":"string"},"new_value":{"title":"New Value"},"old_value":{"title":"Old Value"}},"required":["field","old_value","new_value"],"title":"EnrichmentAuditFieldChangeSchema","type":"object"},"EnrichmentAuditLogReadSchema":{"description":"Read schema for one enrichment audit log entry.","properties":{"action":{"$ref":"#/components/schemas/TableEnrichmentAuditAction"},"actor":{"title":"Actor","type":"string"},"actor_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Display Name"},"actor_type":{"$ref":"#/components/schemas/ActorKind"},"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Column Id"},"context":{"discriminator":{"mapping":{"assistant_applied":"#/components/schemas/AssistantAppliedContextSchema","assistant_undone":"#/components/schemas/AssistantUndoneContextSchema","configured":"#/components/schemas/EnrichmentConfiguredContextSchema","cost_incurred":"#/components/schemas/EnrichmentCostIncurredContextSchema","edited":"#/components/schemas/EnrichmentEditedContextSchema","export_configured":"#/components/schemas/ExportConfiguredContextSchema","export_run_requested":"#/components/schemas/ExportRunRequestedContextSchema","file_exported":"#/components/schemas/ExportFileDownloadedContextSchema","run_cancelled":"#/components/schemas/EnrichmentRunCancelledContextSchema","run_requested":"#/components/schemas/EnrichmentRunRequestedContextSchema","unrecognised":"#/components/schemas/UnrecognisedEnrichmentContextSchema"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentConfiguredContextSchema"},{"$ref":"#/components/schemas/EnrichmentEditedContextSchema"},{"$ref":"#/components/schemas/EnrichmentRunRequestedContextSchema"},{"$ref":"#/components/schemas/EnrichmentRunCancelledContextSchema"},{"$ref":"#/components/schemas/EnrichmentCostIncurredContextSchema"},{"$ref":"#/components/schemas/ExportConfiguredContextSchema"},{"$ref":"#/components/schemas/ExportRunRequestedContextSchema"},{"$ref":"#/components/schemas/ExportFileDownloadedContextSchema"},{"$ref":"#/components/schemas/AssistantAppliedContextSchema"},{"$ref":"#/components/schemas/AssistantUndoneContextSchema"},{"$ref":"#/components/schemas/UnrecognisedEnrichmentContextSchema"}],"title":"Context"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"proposal_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Proposal Id"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["id","table_id","column_id","action","actor_type","actor","context","created_at"],"title":"EnrichmentAuditLogReadSchema","type":"object"},"EnrichmentCanonicalFieldSchema":{"description":"One fact a data enrichment takes in or gives back.","properties":{"always_present":{"default":true,"description":"Outputs only: whether a successful row always carries this fact. False marks a fact that can come back empty even when the enrichment worked, so the editor can say so while the column is being set up rather than leaving it to be discovered.","title":"Always Present","type":"boolean"},"auto_promote":{"default":true,"description":"Outputs only: whether the fan-out gives this fact a column of its own. False keeps it payload-only (stored with the answer and promotable by hand) for provenance-grade facts that would otherwise widen every table they land on.","title":"Auto Promote","type":"boolean"},"choices":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"Select outputs only: the fixed vocabulary the answer comes from, so a column created from this fact is born with its options set.","title":"Choices"},"creates_column":{"default":true,"description":"Outputs only: whether setting this action up actually adds a column for this fact. Derived: it is auto_promote AND a type the fan-out can expand (a list or nested object has no single cell shape and stays in the payload). Sent already resolved so the column editor's outputs preview can promise exactly the columns that will appear, rather than restating two rules and drifting.","title":"Creates Column","type":"boolean"},"description":{"title":"Description","type":"string"},"display_name":{"title":"Display Name","type":"string"},"field_type":{"$ref":"#/components/schemas/TableColumnType","description":"The column type this fact stores as."},"name":{"description":"The key a column's bindings and output fields use.","title":"Name","type":"string"},"required":{"default":false,"description":"Inputs only: whether the enrichment cannot run without it. False where several facts can each drive it.","title":"Required","type":"boolean"}},"required":["name","display_name","description","field_type"],"title":"EnrichmentCanonicalFieldSchema","type":"object"},"EnrichmentCellOutcome":{"description":"How one cell's enrichment execution ended.\n\n``SKIPPED`` is a first-class third outcome: the action was deliberately\nnot run (a required input was empty), no work was done, and nothing is\ncharged.","enum":["succeeded","failed","skipped"],"title":"EnrichmentCellOutcome","type":"string"},"EnrichmentCellRunSchema":{"description":"One cell's most recent enrichment execution, for inspection.\n\n``raw_response`` is the model's STRUCTURED payload (the parsed fields,\npre-coercion), never the provider transcript; summaries and error text\nstay sanitized and length-capped, so nothing here needs masking after\nthe fact.","properties":{"action_key":{"title":"Action Key","type":"string"},"business_context_empty":{"description":"Whether the column asked for the workspace's business context and there was none, so the run worked without it.","title":"Business Context Empty","type":"boolean"},"cached_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Prompt tokens served from cache; null when unreported.","title":"Cached Tokens"},"completion_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Completion tokens used; null when unreported.","title":"Completion Tokens"},"confidence":{"anyOf":[{"$ref":"#/components/schemas/AgentConfidence"},{"type":"null"}],"description":"The agent's own read on the answer; null for non-agent actions."},"created_at":{"format":"date-time","title":"Created At","type":"string"},"credits_breakdown":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"description":"What credits_charged is made of, in decimal credits: 'research' (the agent's own work) plus one entry per lookup that found something, keyed 'find_work_email' / 'read_linkedin_profile'. Null for every other cell.","title":"Credits Breakdown"},"credits_charged":{"description":"What executing this cell cost, by the page charge's rule.","title":"Credits Charged","type":"number"},"credits_max":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The most this cell could have cost, in decimal credits, when its action charges what a row used under a per-row maximum (Use AI); null otherwise.","title":"Credits Max"},"details_pruned":{"description":"Whether the run is past detail retention. When true, empty trail fields (steps, reasoning, sources) mean the detail aged out, not that the run never had one.","title":"Details Pruned","type":"boolean"},"duration_ms":{"title":"Duration Ms","type":"integer"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_class":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentErrorClass"},{"type":"null"}]},"id":{"format":"uuid","title":"Id","type":"string"},"model_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Key"},"outcome":{"$ref":"#/components/schemas/EnrichmentCellOutcome"},"prompt_text":{"description":"The resolved per-row prompt the action received.","title":"Prompt Text","type":"string"},"prompt_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Prompt tokens used; null when unreported.","title":"Prompt Tokens"},"raw_response":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"The model's structured payload exactly as returned, before coercion; null when the action produced none.","title":"Raw Response"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"reasoning_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Hidden reasoning tokens billed as output; null when unreported.","title":"Reasoning Tokens"},"run_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The table run that executed the cell.","title":"Run Id"},"source_attempts":{"description":"A curated enrichment's per-attempt trail; empty elsewhere.","items":{"$ref":"#/components/schemas/EnrichmentRunSourceAttemptSchema"},"title":"Source Attempts","type":"array"},"sources":{"description":"The pages the agent successfully read, deduplicated.","items":{"$ref":"#/components/schemas/EnrichmentRunSourceSchema"},"title":"Sources","type":"array"},"steps":{"items":{"$ref":"#/components/schemas/EnrichmentRunStepSchema"},"title":"Steps","type":"array"},"total_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Total tokens used; null when unreported.","title":"Total Tokens"},"web_read_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Web-read credits the run's page fetches billed, summed across steps; null for cells without web tools or rows predating the telemetry.","title":"Web Read Credits"}},"required":["id","run_id","action_key","model_key","prompt_text","outcome","error","error_class","duration_ms","confidence","reasoning","steps","sources","raw_response","prompt_tokens","completion_tokens","total_tokens","cached_tokens","reasoning_tokens","web_read_credits","credits_charged","credits_max","credits_breakdown","source_attempts","created_at","details_pruned","business_context_empty"],"title":"EnrichmentCellRunSchema","type":"object"},"EnrichmentColumnDefinition-Input":{"description":"Definition of an enrichment column: an external action run once per row.\n\nThe action is named by its registry key; everything the action needs to run\n(its prompt, model, output shape, settings) grows on this member rather\nthan on the column row, so the definition-version snapshot covers all of\nit.","properties":{"action_key":{"description":"The enrichment action's registry key; validated against the catalog.","maxLength":100,"minLength":1,"title":"Action Key","type":"string"},"action_settings":{"anyOf":[{"discriminator":{"mapping":{"agent":"#/components/schemas/AgentSettings","builtin":"#/components/schemas/BuiltinAgentSettings","dev_echo":"#/components/schemas/DevEchoSettings","dev_flaky":"#/components/schemas/DevFlakySettings","enrichment":"#/components/schemas/EnrichmentSettings","http_api":"#/components/schemas/HttpApiSettings-Input","http_api_jwt":"#/components/schemas/HttpApiJwtSettings-Input","integration_lookup":"#/components/schemas/IntegrationLookupSettings","lookup":"#/components/schemas/LookupSettings","outreach_activity":"#/components/schemas/OutreachActivitySettings","provider":"#/components/schemas/ProviderSettings","rep_data":"#/components/schemas/RepDataSettings","send_to_table":"#/components/schemas/SendToTableSettings","use_ai":"#/components/schemas/UseAISettings"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/UseAISettings"},{"$ref":"#/components/schemas/BuiltinAgentSettings"},{"$ref":"#/components/schemas/AgentSettings"},{"$ref":"#/components/schemas/DevEchoSettings"},{"$ref":"#/components/schemas/DevFlakySettings"},{"$ref":"#/components/schemas/EnrichmentSettings"},{"$ref":"#/components/schemas/ProviderSettings"},{"$ref":"#/components/schemas/HttpApiSettings-Input"},{"$ref":"#/components/schemas/HttpApiJwtSettings-Input"},{"$ref":"#/components/schemas/LookupSettings"},{"$ref":"#/components/schemas/IntegrationLookupSettings"},{"$ref":"#/components/schemas/SendToTableSettings"},{"$ref":"#/components/schemas/RepDataSettings"},{"$ref":"#/components/schemas/OutreachActivitySettings"}]},{"type":"null"}],"description":"Action-specific configuration; its kind must match the action key. None uses the action's defaults.","title":"Action Settings"},"kind":{"const":"enrichment","default":"enrichment","title":"Kind","type":"string"},"model_key":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"description":"The user-facing model catalog key this column runs on; None uses the action's default model.","title":"Model Key"},"output":{"description":"The declared result shape: named typed fields, or a raw strict-mode JSON schema in the advanced mode. The column's own type derives from it: the single field's type, or a structured object for multi-field outputs.","discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Input","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Input"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}],"title":"Output"},"prompt":{"$ref":"#/components/schemas/EnrichmentPromptTemplate","description":"The persisted instructions: ordered text and column-reference segments, references stored by column identity so renames never break a prompt."}},"required":["action_key"],"title":"EnrichmentColumnDefinition","type":"object"},"EnrichmentColumnDefinition-Output":{"description":"Definition of an enrichment column: an external action run once per row.\n\nThe action is named by its registry key; everything the action needs to run\n(its prompt, model, output shape, settings) grows on this member rather\nthan on the column row, so the definition-version snapshot covers all of\nit.","properties":{"action_key":{"description":"The enrichment action's registry key; validated against the catalog.","maxLength":100,"minLength":1,"title":"Action Key","type":"string"},"action_settings":{"anyOf":[{"discriminator":{"mapping":{"agent":"#/components/schemas/AgentSettings","builtin":"#/components/schemas/BuiltinAgentSettings","dev_echo":"#/components/schemas/DevEchoSettings","dev_flaky":"#/components/schemas/DevFlakySettings","enrichment":"#/components/schemas/EnrichmentSettings","http_api":"#/components/schemas/HttpApiSettings-Output","http_api_jwt":"#/components/schemas/HttpApiJwtSettings-Output","integration_lookup":"#/components/schemas/IntegrationLookupSettings","lookup":"#/components/schemas/LookupSettings","outreach_activity":"#/components/schemas/OutreachActivitySettings","provider":"#/components/schemas/ProviderSettings","rep_data":"#/components/schemas/RepDataSettings","send_to_table":"#/components/schemas/SendToTableSettings","use_ai":"#/components/schemas/UseAISettings"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/UseAISettings"},{"$ref":"#/components/schemas/BuiltinAgentSettings"},{"$ref":"#/components/schemas/AgentSettings"},{"$ref":"#/components/schemas/DevEchoSettings"},{"$ref":"#/components/schemas/DevFlakySettings"},{"$ref":"#/components/schemas/EnrichmentSettings"},{"$ref":"#/components/schemas/ProviderSettings"},{"$ref":"#/components/schemas/HttpApiSettings-Output"},{"$ref":"#/components/schemas/HttpApiJwtSettings-Output"},{"$ref":"#/components/schemas/LookupSettings"},{"$ref":"#/components/schemas/IntegrationLookupSettings"},{"$ref":"#/components/schemas/SendToTableSettings"},{"$ref":"#/components/schemas/RepDataSettings"},{"$ref":"#/components/schemas/OutreachActivitySettings"}]},{"type":"null"}],"description":"Action-specific configuration; its kind must match the action key. None uses the action's defaults.","title":"Action Settings"},"kind":{"const":"enrichment","default":"enrichment","title":"Kind","type":"string"},"model_key":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"description":"The user-facing model catalog key this column runs on; None uses the action's default model.","title":"Model Key"},"output":{"description":"The declared result shape: named typed fields, or a raw strict-mode JSON schema in the advanced mode. The column's own type derives from it: the single field's type, or a structured object for multi-field outputs.","discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Output","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Output"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}],"title":"Output"},"prompt":{"$ref":"#/components/schemas/EnrichmentPromptTemplate","description":"The persisted instructions: ordered text and column-reference segments, references stored by column identity so renames never break a prompt."}},"required":["action_key"],"title":"EnrichmentColumnDefinition","type":"object"},"EnrichmentColumnDraftSchema":{"description":"A generated draft configuration that seeds the column editor.","properties":{"action_key":{"title":"Action Key","type":"string"},"display_name":{"title":"Display Name","type":"string"},"model_key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The suggested model; null keeps the catalog default.","title":"Model Key"},"output":{"discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Output","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Output"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}],"title":"Output"},"prompt":{"$ref":"#/components/schemas/EnrichmentPromptTemplate","description":"The drafted prompt, with references to existing columns."},"web_research":{"description":"Whether the drafted task needs live web research. Always false for actions other than Use AI, which is the only one with a web-research switch to prefill.","title":"Web Research","type":"boolean"}},"required":["display_name","action_key","prompt","output","model_key","web_research"],"title":"EnrichmentColumnDraftSchema","type":"object"},"EnrichmentConfiguredContextSchema":{"description":"Context for an enrichment column's creation.","properties":{"action_key":{"title":"Action Key","type":"string"},"column_display_name":{"title":"Column Display Name","type":"string"},"model_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Key"},"output_mode":{"title":"Output Mode","type":"string"},"type":{"const":"configured","default":"configured","title":"Type","type":"string"}},"required":["column_display_name","action_key","output_mode"],"title":"EnrichmentConfiguredContextSchema","type":"object"},"EnrichmentCostIncurredContextSchema":{"description":"Context for a run's settled per-column cost.","properties":{"cells_failed":{"title":"Cells Failed","type":"integer"},"cells_no_data":{"title":"Cells No Data","type":"integer"},"cells_skipped":{"title":"Cells Skipped","type":"integer"},"cells_succeeded":{"title":"Cells Succeeded","type":"integer"},"credits_charged":{"title":"Credits Charged","type":"number"},"run_id":{"format":"uuid","title":"Run Id","type":"string"},"run_status":{"title":"Run Status","type":"string"},"type":{"const":"cost_incurred","default":"cost_incurred","title":"Type","type":"string"}},"required":["run_id","run_status","credits_charged","cells_succeeded","cells_failed","cells_skipped","cells_no_data"],"title":"EnrichmentCostIncurredContextSchema","type":"object"},"EnrichmentEditedContextSchema":{"description":"Context for an enrichment column's edit.","properties":{"changes":{"items":{"$ref":"#/components/schemas/EnrichmentAuditFieldChangeSchema"},"title":"Changes","type":"array"},"column_display_name":{"title":"Column Display Name","type":"string"},"type":{"const":"edited","default":"edited","title":"Type","type":"string"}},"required":["column_display_name","changes"],"title":"EnrichmentEditedContextSchema","type":"object"},"EnrichmentErrorClass":{"description":"Machine-readable classification of a failed enrichment cell.\n\nThe class decides everything downstream: whether the executor retries\n(transient classes) or gives up (terminal ones), what the cell tooltip\nnames, and whether the failure is free. Errors never charge, but only a\nclassified error can prove which kind it was. A clean no-answer (no_data)\nis free for a lookup; an AI column's is charged what it used.","enum":["timeout","rate_limited","quota_exhausted","provider_error","network","schema_violation","refused","invalid_input","no_data","enrichment_failed","unexpected"],"title":"EnrichmentErrorClass","type":"string"},"EnrichmentFamily":{"description":"The OUTCOME shelf one data enrichment sits on inside the Enrichment tab.\n\nA second axis under :class:`EnrichmentActionCategory`, not a replacement for\nit: the category answers \"what kind of bargain is this\" (a vendor\nwaterfall, a prompt, a free function) and picks the TAB; the family answers\n\"what do I get out of it\" and picks the SHELF within that tab.\n\nIt exists because the catalog is authored by INPUT (five ways to enrich a\nperson differing only in the key you hand them, three ways to enrich a\ncompany, two ways to find a LinkedIn URL) while people browse it by\nOUTCOME. A flat list of sixteen makes the reader derive the grouping\nthemselves from sixteen verb phrases, every time they open the tab.\n\nOrdered as the shelves render. Authored per waterfall in\n``enrichment_catalog.yaml`` beside ``icon`` and ``tagline``, so a new\nwaterfall declares its shelf in the same edit that creates it rather than\nlanding in whichever bucket a frontend map happens to guess.","enum":["email","phone","company","person","social","marketing"],"title":"EnrichmentFamily","type":"string"},"EnrichmentModelCatalogResponseSchema":{"description":"The user-facing model catalog, cheapest first.","properties":{"agent_tools":{"description":"The enrichment tools a research agent can be given, with whether each can be switched on for this organisation and which models afford it.","items":{"$ref":"#/components/schemas/AgentToolAvailabilitySchema"},"title":"Agent Tools","type":"array"},"models":{"items":{"$ref":"#/components/schemas/EnrichmentModelSchema"},"title":"Models","type":"array"},"second_check_share_without_history":{"description":"For a column with its second check on (an enrichment with offers_second_check, settings.second_check true): the share of rows usually charged a second check, for a column with no history yet. Its 'usually about' figure is the action's credits_per_row times (1 + this share); its most is twice credits_per_row. A saved column reads its own usual_credits_per_row from the credit-rates route.","title":"Second Check Share Without History","type":"number"},"usual_share_without_history":{"description":"The share of its per-row maximum a Use AI row that researches (web research on, or a lookup it may buy) is usually charged, for a column with no charged history yet, such as a draft not saved. Multiply the draft's per-row maximum by it for its 'usually about' figure. A saved column reads its own from GET /tables/{table_id}/columns/credit-rates/ (usual_credits_per_row). 1.0 means no usual figure.","title":"Usual Share Without History","type":"number"},"usual_share_without_history_plain":{"description":"The same share for a Use AI row that makes one plain model call: web research off and no lookup switched on. Such a row is charged far under its maximum, so a draft like that is quoted at this share, not usual_share_without_history. 1.0 means no usual figure.","title":"Usual Share Without History Plain","type":"number"}},"required":["models","usual_share_without_history","usual_share_without_history_plain","second_check_share_without_history"],"title":"EnrichmentModelCatalogResponseSchema","type":"object"},"EnrichmentModelSchema":{"description":"One user-facing model as the picker and compare view render it.","properties":{"best_for":{"title":"Best For","type":"string"},"credits_per_row":{"description":"The base: the most one row's AI work costs on this model, in decimal credits. A row is charged what it used, never more.","title":"Credits Per Row","type":"number"},"description":{"description":"One line: the speed/quality trade this tier makes.","title":"Description","type":"string"},"display_name":{"title":"Display Name","type":"string"},"is_default":{"description":"Pre-selected when the column has no stored choice.","title":"Is Default","type":"boolean"},"is_variable_price":{"description":"True marks token-billed models whose estimates are approximate.","title":"Is Variable Price","type":"boolean"},"key":{"description":"The catalog key stored on enrichment column definitions.","title":"Key","type":"string"},"lookup_credits_per_find":{"additionalProperties":{"type":"number"},"description":"What each agent lookup adds to a row when it finds something, keyed 'find_work_email' / 'read_linkedin_profile', in decimal credits. A lookup that is switched on raises the row's maximum by its price; a miss is free.","title":"Lookup Credits Per Find","type":"object"},"speed":{"title":"Speed","type":"string"},"supported_actions":{"description":"The action keys that can run on this model; the picker filters on it and the save path rejects an undeclared pairing.","items":{"type":"string"},"title":"Supported Actions","type":"array"},"web_research_credits_per_row":{"description":"What turning web research on adds to a row's maximum, in decimal credits.","title":"Web Research Credits Per Row","type":"number"}},"required":["key","display_name","description","credits_per_row","web_research_credits_per_row","lookup_credits_per_find","is_variable_price","speed","best_for","is_default","supported_actions"],"title":"EnrichmentModelSchema","type":"object"},"EnrichmentOutputField":{"description":"One named, typed value an enrichment run returns.\n\nField types are drawn from the platform's existing column types, so any\nsingle field can later be promoted into an ordinary typed column without\ninventing a new type system.","properties":{"choices":{"anyOf":[{"items":{"type":"string"},"maxItems":200,"type":"array"},{"type":"null"}],"description":"The fixed option list for a select field; None elsewhere.","title":"Choices"},"description":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"description":"Shown to the model: what this field should contain.","title":"Description"},"field_type":{"$ref":"#/components/schemas/TableColumnType","default":"text"},"name":{"maxLength":100,"minLength":1,"title":"Name","type":"string"}},"required":["name"],"title":"EnrichmentOutputField","type":"object"},"EnrichmentOutputFields-Input":{"description":"The fields-mode output shape: repeatable named typed fields.\n\nThe default is Clay's: one text field named ``response``.","properties":{"fields":{"items":{"$ref":"#/components/schemas/EnrichmentOutputField"},"maxItems":50,"minItems":1,"title":"Fields","type":"array"},"mode":{"const":"fields","default":"fields","title":"Mode","type":"string"}},"title":"EnrichmentOutputFields","type":"object"},"EnrichmentOutputFields-Output":{"description":"The fields-mode output shape: repeatable named typed fields.\n\nThe default is Clay's: one text field named ``response``.","properties":{"fields":{"items":{"$ref":"#/components/schemas/EnrichmentOutputField"},"maxItems":50,"minItems":1,"title":"Fields","type":"array"},"mode":{"const":"fields","default":"fields","title":"Mode","type":"string"}},"title":"EnrichmentOutputFields","type":"object"},"EnrichmentOutputRawSchema":{"description":"The advanced output shape: a raw strict-mode JSON schema, verbatim.\n\nHeld to every strict-mode constraint at SAVE time by the service layer.\nThe shape is stored exactly as authored, and validation failures name the\nexact violated rule rather than surfacing at run time.","properties":{"json_schema":{"additionalProperties":true,"description":"A strict-mode JSON schema with an object root.","title":"Json Schema","type":"object"},"mode":{"const":"json_schema","default":"json_schema","title":"Mode","type":"string"}},"required":["json_schema"],"title":"EnrichmentOutputRawSchema","type":"object"},"EnrichmentPromptColumnRefSegment":{"description":"An inline reference to another column's per-row value.\n\nStored by column IDENTITY, never by display name, so renaming a column can\nnever change what a prompt means, and a deleted column is detectable\nrather than silently resolving to nothing.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"path":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"description":"Dot-separated address of a sub-value inside a structured cell: output field names and zero-based list indices, e.g. 'competitors.0'. None references the whole cell. Emptiness for the required rule is judged on the addressed sub-value.","title":"Path"},"required":{"default":true,"description":"Whether a row whose value for this column is empty is skipped entirely instead of run with a blank substituted.","title":"Required","type":"boolean"},"type":{"const":"column_ref","default":"column_ref","title":"Type","type":"string"}},"required":["column_id"],"title":"EnrichmentPromptColumnRefSegment","type":"object"},"EnrichmentPromptTemplate":{"description":"The persisted prompt: an ordered mix of text and column references.\n\nResolution to a per-row string happens at run time; the segment list is\nthe single source of truth the editor renders pills from and the executor\nsubstitutes values into.","properties":{"format":{"default":"plain","description":"How the editor reads text segments: 'markdown' renders them as markdown source, 'plain' verbatim. Templates saved before the field existed carry no value and default to 'plain', the safe reading. Purely editor metadata: run-time resolution concatenates text segments identically either way.","enum":["plain","markdown"],"title":"Format","type":"string"},"segments":{"items":{"discriminator":{"mapping":{"column_ref":"#/components/schemas/EnrichmentPromptColumnRefSegment","text":"#/components/schemas/EnrichmentPromptTextSegment"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentPromptTextSegment"},{"$ref":"#/components/schemas/EnrichmentPromptColumnRefSegment"}]},"maxItems":100,"title":"Segments","type":"array"}},"title":"EnrichmentPromptTemplate","type":"object"},"EnrichmentPromptTextSegment":{"description":"A literal run of prompt text.","properties":{"text":{"maxLength":20000,"title":"Text","type":"string"},"type":{"const":"text","default":"text","title":"Type","type":"string"}},"required":["text"],"title":"EnrichmentPromptTextSegment","type":"object"},"EnrichmentProviderFieldSchema":{"description":"One declared input or output field of a provider enrichment operation.","properties":{"description":{"title":"Description","type":"string"},"display_name":{"title":"Display Name","type":"string"},"example":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"description":"A sample value shown before anything has run.","title":"Example"},"name":{"description":"The stable field name used in bindings and payloads.","title":"Name","type":"string"},"required":{"description":"Inputs only: the operation cannot run without this field.","title":"Required","type":"boolean"},"value_kind":{"description":"JSON-schema primitive kind ('string', 'integer', 'number', 'boolean', 'array', 'object'). A rendering hint.","title":"Value Kind","type":"string"}},"required":["name","display_name","description","required","value_kind"],"title":"EnrichmentProviderFieldSchema","type":"object"},"EnrichmentProviderOperationSchema":{"description":"The provider-side identity of an integration-backed enrichment action.","properties":{"inputs":{"items":{"$ref":"#/components/schemas/EnrichmentProviderFieldSchema"},"title":"Inputs","type":"array"},"integration_type":{"description":"The integration slug, also the connect-flow integration type.","title":"Integration Type","type":"string"},"operation_key":{"description":"The operation's stable key within the SDK.","title":"Operation Key","type":"string"},"outputs":{"items":{"$ref":"#/components/schemas/EnrichmentProviderFieldSchema"},"title":"Outputs","type":"array"},"required_input_combinations":{"description":"Alternative input sets that each make the operation runnable: a configuration saves when ANY one set is fully bound. The editor renders this as 'needs A + B, or C'.","items":{"items":{"type":"string"},"type":"array"},"title":"Required Input Combinations","type":"array"}},"required":["integration_type","operation_key","inputs","outputs"],"title":"EnrichmentProviderOperationSchema","type":"object"},"EnrichmentRefundRule":{"description":"A declarative promise about when a charged cell's credits come back.\n\nDeclared per action so \"you won't be charged when nothing is found\" is a\ncatalog fact the UI can print and a test can enforce, not folklore about\nhow the charge code happens to behave.","enum":["success_no_data","success_blocked_data","success_preview_run"],"title":"EnrichmentRefundRule","type":"string"},"EnrichmentRunCancelledContextSchema":{"description":"Context for a run cancellation.","properties":{"run_ids":{"items":{"format":"uuid","type":"string"},"title":"Run Ids","type":"array"},"type":{"const":"run_cancelled","default":"run_cancelled","title":"Type","type":"string"}},"required":["run_ids"],"title":"EnrichmentRunCancelledContextSchema","type":"object"},"EnrichmentRunRequestedContextSchema":{"description":"Context for a run requested at a given scope.","properties":{"column_display_name":{"title":"Column Display Name","type":"string"},"credits_estimated":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits Estimated"},"run_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Run Id"},"scope":{"title":"Scope","type":"string"},"type":{"const":"run_requested","default":"run_requested","title":"Type","type":"string"}},"required":["column_display_name","scope"],"title":"EnrichmentRunRequestedContextSchema","type":"object"},"EnrichmentRunSourceAttemptSchema":{"description":"One attempt inside a curated enrichment, in the order it was made.\n\nPosition and outcome only. A customer can see that four sources were\ntried and the third answered, which is what makes an empty or expensive\ncell explicable, but not WHICH sources, because that is not a fact about\ntheir data.","properties":{"attempt_index":{"title":"Attempt Index","type":"integer"},"credits_charged":{"description":"The winning attempt's price; zero for every other attempt, and for a winning answer reused from the cache.","title":"Credits Charged","type":"number"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_class":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentErrorClass"},{"type":"null"}]},"outcome":{"$ref":"#/components/schemas/EnrichmentCellOutcome"},"served_from_cache":{"default":false,"description":"Whether the attempt reused an answer an identical earlier lookup in this workspace already paid for, instead of asking a source again. A reused winning answer is free.","title":"Served From Cache","type":"boolean"},"skipped_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why a skipped attempt never ran (e.g. its missing-input message); null for attempts that executed.","title":"Skipped Reason"}},"required":["attempt_index","outcome","error","error_class","credits_charged"],"title":"EnrichmentRunSourceAttemptSchema","type":"object"},"EnrichmentRunSourceSchema":{"description":"One source the agent actually read: what, called what, and when.","properties":{"fetched_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the agent read it; null on records that predate it.","title":"Fetched At"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"title":"Url","type":"string"}},"required":["url","title","fetched_at"],"title":"EnrichmentRunSourceSchema","type":"object"},"EnrichmentRunStepSchema":{"description":"One agent step as the inspection drawer renders it.","properties":{"action":{"$ref":"#/components/schemas/AgentStepAction"},"detail":{"description":"The search query or fetched URL.","title":"Detail","type":"string"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How long the step took; null on records that predate timing.","title":"Duration Ms"},"observation":{"description":"One line on what came back.","title":"Observation","type":"string"},"outcome":{"$ref":"#/components/schemas/AgentStepOutcome","description":"How the step ended: completed, failed, or refused."},"thought":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The model's stated reasoning for this step; null on records that predate thoughts.","title":"Thought"}},"required":["action","detail","observation","duration_ms","outcome"],"title":"EnrichmentRunStepSchema","type":"object"},"EnrichmentSettings":{"description":"Settings for a curated enrichment: which columns supply which facts.\n\nThe whole configuration of an enrichment column, and deliberately tiny.\nIts predecessor stored the entire fallback chain here: an ordered list of\nvendor operations, each with its own input mapping, assembled by the\ncustomer in the editor. That made the supply chain part of the customer's\ndata: visible in the API, editable by hand, and frozen at the moment they\nsaved it, so improving a chain meant migrating every column that had\ncopied it.\n\nNow the chain lives in the catalog and is resolved per run. A column\nstores only the outcome it wants (the action key) and where its inputs\ncome from, keyed by CANONICAL name (``full_name``, ``company_domain``),\nnever by whatever the vendor at the front of today's chain happens to call\nthem. Adding a supplier, reordering the chain or renaming a vendor's field\nchanges nothing here.","properties":{"input_bindings":{"additionalProperties":{"format":"uuid","type":"string"},"description":"Canonical input name → the column that supplies it.","maxProperties":10,"title":"Input Bindings","type":"object"},"kind":{"const":"enrichment","default":"enrichment","title":"Kind","type":"string"},"second_check":{"default":false,"description":"Whether an answer the enrichment marks as worth a second look (Verify email's catch-all) goes on to the next supplier instead of ending the lookup. Kept when no later supplier gives a definite answer. A second check that answers is charged as one more lookup. Only offered where the enrichment has such answers.","title":"Second Check","type":"boolean"}},"title":"EnrichmentSettings","type":"object"},"EnrolRowsRequestSchema":{"properties":{"record_ids":{"description":"Grid rows to enrol.","items":{"format":"uuid","type":"string"},"maxItems":1000,"minItems":1,"title":"Record Ids","type":"array"},"sequence_id":{"description":"The sequence the rows join.","format":"uuid","title":"Sequence Id","type":"string"}},"required":["sequence_id","record_ids"],"title":"EnrolRowsRequestSchema","type":"object"},"EnrolRowsResponseSchema":{"properties":{"enrolled":{"title":"Enrolled","type":"integer"}},"required":["enrolled"],"title":"EnrolRowsResponseSchema","type":"object"},"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.","enum":["connected_before_withdraw","invite_look_unreadable"],"title":"EnrolmentFailureCode","type":"string"},"EnrolmentListReadSchema":{"properties":{"enrolments":{"items":{"$ref":"#/components/schemas/EnrolmentReadSchema"},"title":"Enrolments","type":"array"},"total":{"title":"Total","type":"integer"}},"required":["enrolments","total"],"title":"EnrolmentListReadSchema","type":"object"},"EnrolmentReadSchema":{"properties":{"bounced":{"title":"Bounced","type":"boolean"},"company_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Key"},"contact_company":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Their company, from whichever column of the audience row holds one.","title":"Contact Company"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The person's name from their audience row: a full-name column where filled, else the given and family names joined. Null when the table names nobody.","title":"Contact Name"},"contact_number":{"default":0,"description":"This contact's ordinal within the sequence, from 1. A label of last resort, for a contact with neither an address nor a LinkedIn profile.","title":"Contact Number","type":"integer"},"contact_title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Their job title, from whichever column of the audience row holds one.","title":"Contact Title"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"current_step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Current Step Id"},"decides_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"For a contact on a condition that waits (Replied?, Bounced?, Accepted?), or waiting for a connection request's answer: when the branch is decided. On a request it is when its answer window closes; in the past, the window is over and one more reading decides.","title":"Decides At"},"due_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Due At"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"failure_code":{"anyOf":[{"$ref":"#/components/schemas/EnrolmentFailureCode"},{"type":"null"}],"description":"Which kind of failure stopped a failed contact, where it changes what Retry does: connected_before_withdraw (a Withdraw found them already connected; nothing to retry, so no Retry is offered) or invite_look_unreadable (the look at their profile could not tell whether they accepted; Retry looks again). Null for every other failure and status."},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why a failed contact stopped, in the words of its status cell: for a LinkedIn step, the browser's own reason. Retry runs the same step again. Null on every other status.","title":"Failure Reason"},"held_by_sequence":{"anyOf":[{"$ref":"#/components/schemas/HeldBySequenceReadSchema"},{"type":"null"}],"description":"On a contact skipped because they are in another live sequence (status skipped_duplicate): that sequence of this workspace, by id and name. Null for every other status, and once nothing holds the contact, which is when the next sync takes them in."},"hold_reason":{"anyOf":[{"$ref":"#/components/schemas/HoldReason"},{"type":"null"}],"description":"Why the send path pushed this contact's next attempt out to due_at. Set only on an active contact whose due_at is still ahead. 'window' also covers a contact due on one of the sending window's openings, whoever scheduled them."},"id":{"format":"uuid","title":"Id","type":"string"},"invited_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the connection request this contact stands on went out, or was first seen already pending: set while they wait for its answer (and kept through a pause or a stop). Null on every other step, and on a completed contact.","title":"Invited At"},"last_contacted_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The touch a cooldown stop is measured from. Whoever made it is deliberately never named, because it may be a colleague's sequence entirely.","title":"Last Contacted At"},"last_step_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When that step ran.","title":"Last Step At"},"last_step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The step this contact last actually ran. Not the step before current_step_id: on a branching graph those are different steps.","title":"Last Step Id"},"linkedin_queue":{"anyOf":[{"$ref":"#/components/schemas/LinkedInQueueState"},{"type":"null"}],"description":"Set beside waiting_on 'linkedin': where the contact's step stands in the sending account's line. 'running' is in a browser now; 'queued' is in line (see linkedin_steps_ahead and linkedin_starts_at); the rest say why the line is not moving for it: the sequence's sending hours shut in the sender's timezone ('outside_window'), a daily or weekly limit for its kind, no browser checked in for fifteen minutes, LinkedIn asking to verify the account, or the account disconnected."},"linkedin_resets_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"For a step held by a daily or weekly limit, when the limit it waits on resets (midnight in the sender's timezone). Null otherwise.","title":"Linkedin Resets At"},"linkedin_starts_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the step is expected to start, simulated the way the account's governor hands steps out: the next gap is exact, later gaps are the account's time between steps widened by the average jitter, and a step held by a daily or weekly limit starts after that limit resets. Null where no time can be named.","title":"Linkedin Starts At"},"linkedin_steps_ahead":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"For a queued step, how many of the account's steps run before it.","title":"Linkedin Steps Ahead"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"mailbox_address":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The address this contact is emailed from. A contact is only ever emailed from the mailbox that first emailed them, in any sequence. Null until something has emailed them.","title":"Mailbox Address"},"mailbox_issue":{"anyOf":[{"$ref":"#/components/schemas/MailboxIssue"},{"type":"null"}],"description":"Why that mailbox cannot send for this sequence, set while it is what stops the contact (stop_reason mailbox_removed: deleted, not_on_sequence) or holds them (hold_reason mailbox_waiting: disconnected, no_sender)."},"reachable":{"default":true,"description":"Whether any channel this sequence's steps use can reach the contact: an email address for an email step, a LinkedIn profile URL for a LinkedIn one. A sequence with no sending step yet counts both.","title":"Reachable","type":"boolean"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"replied_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Replied At"},"status":{"$ref":"#/components/schemas/EnrolmentStatus"},"stop_reason":{"anyOf":[{"$ref":"#/components/schemas/StopReason"},{"type":"null"}]},"unreachable_reason":{"anyOf":[{"$ref":"#/components/schemas/UnreachableReason"},{"type":"null"}],"description":"Which address the contact lacks, set only while being unreachable is what holds them: the Contacts tab reads it as Unreachable, and the audience eligibility counts them under missing_contact_details. Null for a reachable contact and for one who is settled or held by something named first (do not contact, another sequence, a cooldown)."},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"description":"What the approval queue holds this contact behind, read from the task for their current step: a person's approval, a LinkedIn browser, or an approved email the engine has not sent yet. Null when nothing does."}},"required":["id","record_id","email","status","current_step_id","due_at","stop_reason","bounced","replied_at","company_key","created_at","updated_at"],"title":"EnrolmentReadSchema","type":"object"},"EnrolmentSort":{"description":"The orders the Audience tab can list a sequence's contacts in.","enum":["created_desc","created_asc","status","status_desc","next_due"],"title":"EnrolmentSort","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"},"ExecutiveChangeWindow":{"description":"How recently an executive joined or left a company, as a company search asks it.\n\nNo week: the index dates a leadership change to the month.","enum":["past_month","past_quarter","past_year"],"title":"ExecutiveChangeWindow","type":"string"},"ExportColumnDefinition-Input":{"description":"Definition of an export column: one row pushed to a connected destination.\n\nThe cell holds the RECEIPT of that push (status, the destination record\nid, when it happened), never the row's own data (see\n``TableColumnKind.EXPORT``). The destination integration is named by id\nplus a denormalized ``integration_type``, for the same reason\n``table_import_integration`` denormalizes it: rendering a column must not need a join\ninto the integration stratum.","properties":{"action":{"$ref":"#/components/schemas/ExportWriteAction","default":"upsert"},"batched":{"default":false,"description":"Write rows in destination-sized batches instead of one at a time. Faster, at a cost: the destination reports batch-level results, so receipts say 'pushed' rather than created-versus-updated, and a burst of writes can overwhelm automations attached to the destination. Off by default for that reason.","title":"Batched","type":"boolean"},"fields":{"description":"The destination properties written, in mapping order.","items":{"$ref":"#/components/schemas/ExportFieldMapping-Input"},"maxItems":200,"minItems":1,"title":"Fields","type":"array"},"identity":{"description":"The destination fields the row may be identified by: the match key that decides create-versus-update, required for every action. More than one is an ordered FALLBACK, not a composite key: the first entry that renders a non-empty value for a row is the one that row is matched on, and the rest are not consulted. Order them most to least trustworthy ('match on work email, failing that personal email'). Matching on two fields at once is not offered because the destination contract takes a single identity field.","items":{"$ref":"#/components/schemas/ExportIdentityMapping-Input"},"maxItems":4,"title":"Identity","type":"array"},"integration_id":{"description":"The connected DESTINATION integration this column writes to.","format":"uuid","title":"Integration Id","type":"string"},"integration_type":{"description":"Provider slug, denormalized so display needs no cross-stratum join.","maxLength":100,"minLength":1,"title":"Integration Type","type":"string"},"kind":{"const":"export","default":"export","title":"Kind","type":"string"},"only_on_change":{"default":true,"description":"Skip a row whose outgoing payload is identical to the one last successfully written. The row-level idempotency knob; off, every run re-writes every row.","title":"Only On Change","type":"boolean"},"record_type":{"description":"Which destination object to write: 'contacts', 'deals', a custom type.","maxLength":255,"minLength":1,"title":"Record Type","type":"string"},"remove_blanks":{"default":true,"description":"Drop fields whose rendered value is empty from the outgoing payload rather than sending a blank. Off, a blank clears the destination value: a deliberate act, not a default.","title":"Remove Blanks","type":"boolean"},"retry":{"$ref":"#/components/schemas/ExportRetryPolicy","description":"Retry, timeout and rate-limit behaviour for this column's writes."},"typecast":{"default":true,"description":"Coerce each rendered value into the destination property's declared type before writing. Off, values are sent verbatim and the destination's own coercion applies.","title":"Typecast","type":"boolean"},"update_mode":{"default":"patch","description":"replace overwrites the whole record, patch touches only the mapped fields, set_once writes only where the destination is empty. Degrades to patch at run time when the destination does not declare replace, the same fallback the sync export makes.","enum":["replace","patch","set_once"],"title":"Update Mode","type":"string"}},"required":["integration_id","integration_type","record_type","fields"],"title":"ExportColumnDefinition","type":"object"},"ExportColumnDefinition-Output":{"description":"Definition of an export column: one row pushed to a connected destination.\n\nThe cell holds the RECEIPT of that push (status, the destination record\nid, when it happened), never the row's own data (see\n``TableColumnKind.EXPORT``). The destination integration is named by id\nplus a denormalized ``integration_type``, for the same reason\n``table_import_integration`` denormalizes it: rendering a column must not need a join\ninto the integration stratum.","properties":{"action":{"$ref":"#/components/schemas/ExportWriteAction","default":"upsert"},"batched":{"default":false,"description":"Write rows in destination-sized batches instead of one at a time. Faster, at a cost: the destination reports batch-level results, so receipts say 'pushed' rather than created-versus-updated, and a burst of writes can overwhelm automations attached to the destination. Off by default for that reason.","title":"Batched","type":"boolean"},"fields":{"description":"The destination properties written, in mapping order.","items":{"$ref":"#/components/schemas/ExportFieldMapping-Output"},"maxItems":200,"minItems":1,"title":"Fields","type":"array"},"identity":{"description":"The destination fields the row may be identified by: the match key that decides create-versus-update, required for every action. More than one is an ordered FALLBACK, not a composite key: the first entry that renders a non-empty value for a row is the one that row is matched on, and the rest are not consulted. Order them most to least trustworthy ('match on work email, failing that personal email'). Matching on two fields at once is not offered because the destination contract takes a single identity field.","items":{"$ref":"#/components/schemas/ExportIdentityMapping-Output"},"maxItems":4,"title":"Identity","type":"array"},"integration_id":{"description":"The connected DESTINATION integration this column writes to.","format":"uuid","title":"Integration Id","type":"string"},"integration_type":{"description":"Provider slug, denormalized so display needs no cross-stratum join.","maxLength":100,"minLength":1,"title":"Integration Type","type":"string"},"kind":{"const":"export","default":"export","title":"Kind","type":"string"},"only_on_change":{"default":true,"description":"Skip a row whose outgoing payload is identical to the one last successfully written. The row-level idempotency knob; off, every run re-writes every row.","title":"Only On Change","type":"boolean"},"record_type":{"description":"Which destination object to write: 'contacts', 'deals', a custom type.","maxLength":255,"minLength":1,"title":"Record Type","type":"string"},"remove_blanks":{"default":true,"description":"Drop fields whose rendered value is empty from the outgoing payload rather than sending a blank. Off, a blank clears the destination value: a deliberate act, not a default.","title":"Remove Blanks","type":"boolean"},"retry":{"$ref":"#/components/schemas/ExportRetryPolicy","description":"Retry, timeout and rate-limit behaviour for this column's writes."},"typecast":{"default":true,"description":"Coerce each rendered value into the destination property's declared type before writing. Off, values are sent verbatim and the destination's own coercion applies.","title":"Typecast","type":"boolean"},"update_mode":{"default":"patch","description":"replace overwrites the whole record, patch touches only the mapped fields, set_once writes only where the destination is empty. Degrades to patch at run time when the destination does not declare replace, the same fallback the sync export makes.","enum":["replace","patch","set_once"],"title":"Update Mode","type":"string"}},"required":["integration_id","integration_type","record_type","fields"],"title":"ExportColumnDefinition","type":"object"},"ExportConfiguredContextSchema":{"description":"Context for an export column's creation or reconfiguration.","properties":{"batched":{"default":false,"title":"Batched","type":"boolean"},"column_display_name":{"default":"","title":"Column Display Name","type":"string"},"export_action":{"default":"","title":"Export Action","type":"string"},"integration_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Integration Id"},"integration_type":{"default":"","title":"Integration Type","type":"string"},"record_type":{"default":"","title":"Record Type","type":"string"},"type":{"const":"export_configured","default":"export_configured","title":"Type","type":"string"}},"title":"ExportConfiguredContextSchema","type":"object"},"ExportFieldMapping-Input":{"description":"One destination property and where its value comes from.","properties":{"destination_field":{"maxLength":255,"minLength":1,"title":"Destination Field","type":"string"},"property_type":{"anyOf":[{"$ref":"#/components/schemas/PropertyType"},{"type":"null"}],"description":"The type the rendered value is coerced to before it is written, when the definition's ``typecast`` is on. It never creates the property: an export writes only to fields the destination already has. None means the destination's own type is authoritative and the value is sent as rendered."},"skip_if_blank":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Per-field override of the definition's ``remove_blanks``; None inherits it. Set False on one field to send an explicit blank that clears a destination value.","title":"Skip If Blank"},"source":{"$ref":"#/components/schemas/ExportValueSource-Input"}},"required":["destination_field","source"],"title":"ExportFieldMapping","type":"object"},"ExportFieldMapping-Output":{"description":"One destination property and where its value comes from.","properties":{"destination_field":{"maxLength":255,"minLength":1,"title":"Destination Field","type":"string"},"property_type":{"anyOf":[{"$ref":"#/components/schemas/PropertyType"},{"type":"null"}],"description":"The type the rendered value is coerced to before it is written, when the definition's ``typecast`` is on. It never creates the property: an export writes only to fields the destination already has. None means the destination's own type is authoritative and the value is sent as rendered."},"skip_if_blank":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Per-field override of the definition's ``remove_blanks``; None inherits it. Set False on one field to send an explicit blank that clears a destination value.","title":"Skip If Blank"},"source":{"$ref":"#/components/schemas/ExportValueSource-Output"}},"required":["destination_field","source"],"title":"ExportFieldMapping","type":"object"},"ExportFileDownloadedContextSchema":{"description":"Context for a table's file download.","properties":{"filename":{"default":"","title":"Filename","type":"string"},"format":{"default":"csv","title":"Format","type":"string"},"scope":{"default":"","title":"Scope","type":"string"},"table_display_name":{"default":"","title":"Table Display Name","type":"string"},"type":{"const":"file_exported","default":"file_exported","title":"Type","type":"string"}},"title":"ExportFileDownloadedContextSchema","type":"object"},"ExportIdentityMapping-Input":{"description":"One destination field the row may be IDENTIFIED by.\n\nDistinct from ``fields`` because identity is not written the way a\nproperty is: it selects the record for update/upsert, and it is what a\ncreate-only column matches on to avoid making a second copy. A row whose\nidentity renders empty is SKIPPED, never written. An unidentifiable row\nis the case the skip exists for.\n\nSeveral of these form an ordered FALLBACK, not a composite key: see\n``ExportColumnDefinition.identity``.","properties":{"destination_field":{"maxLength":255,"minLength":1,"title":"Destination Field","type":"string"},"source":{"$ref":"#/components/schemas/ExportValueSource-Input"}},"required":["destination_field","source"],"title":"ExportIdentityMapping","type":"object"},"ExportIdentityMapping-Output":{"description":"One destination field the row may be IDENTIFIED by.\n\nDistinct from ``fields`` because identity is not written the way a\nproperty is: it selects the record for update/upsert, and it is what a\ncreate-only column matches on to avoid making a second copy. A row whose\nidentity renders empty is SKIPPED, never written. An unidentifiable row\nis the case the skip exists for.\n\nSeveral of these form an ordered FALLBACK, not a composite key: see\n``ExportColumnDefinition.identity``.","properties":{"destination_field":{"maxLength":255,"minLength":1,"title":"Destination Field","type":"string"},"source":{"$ref":"#/components/schemas/ExportValueSource-Output"}},"required":["destination_field","source"],"title":"ExportIdentityMapping","type":"object"},"ExportPreviewRequestSchema":{"description":"A dry run: render an export against real rows, write nothing.","properties":{"definition":{"$ref":"#/components/schemas/ExportColumnDefinition-Input","description":"The export definition to preview, passed inline so the editor can preview BEFORE the column exists."},"record_ids":{"description":"The rows to preview; the server caps how many render.","items":{"format":"uuid","type":"string"},"maxItems":25,"minItems":1,"title":"Record Ids","type":"array"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","definition","record_ids"],"title":"ExportPreviewRequestSchema","type":"object"},"ExportPreviewResponseSchema":{"description":"The dry run's rows. Counters are absent on purpose: nothing ran.","properties":{"rows":{"items":{"$ref":"#/components/schemas/ExportPreviewRowSchema"},"title":"Rows","type":"array"}},"required":["rows"],"title":"ExportPreviewResponseSchema","type":"object"},"ExportPreviewRowSchema":{"description":"What a real run WOULD do for one row.","properties":{"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A per-row resolution failure, if any.","title":"Error"},"identity":{"additionalProperties":true,"description":"The rendered match values.","title":"Identity","type":"object"},"matched_record_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The destination record the row matched, when one exists.","title":"Matched Record Id"},"properties":{"additionalProperties":true,"description":"The rendered outgoing payload.","title":"Properties","type":"object"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"skipped_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why a row would be skipped.","title":"Skipped Reason"},"would":{"description":"'create', 'update' or 'skip', resolved by read-only matching.","title":"Would","type":"string"}},"required":["record_id","would","identity","properties","matched_record_id","skipped_reason","error"],"title":"ExportPreviewRowSchema","type":"object"},"ExportRetryPolicy":{"description":"One export column's reliability contract with its destination.\n\nDefaults are chosen so the common case needs no configuration: retry the\nerrors worth retrying (rate limits, server errors, network failures) a\nfew times, honour the destination's own Retry-After when it names one,\nand otherwise write as fast as the destination accepts.","properties":{"max_retries":{"default":3,"description":"Retry attempts per row beyond the first, when retrying at all.","maximum":10.0,"minimum":0.0,"title":"Max Retries","type":"integer"},"requests_per_minute":{"anyOf":[{"maximum":6000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Custom ceiling on write calls per minute. None means the destination's own pace. Its live rate-limit answers are honoured either way.","title":"Requests Per Minute"},"retry_on_failure":{"default":true,"description":"Retry a row whose failure is retryable: rate limits, server errors, network failures. Bad requests never retry: the same payload would fail the same way.","title":"Retry On Failure","type":"boolean"},"timeout_seconds":{"anyOf":[{"maximum":600.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Response timeout per destination request. None uses the platform default.","title":"Timeout Seconds"}},"title":"ExportRetryPolicy","type":"object"},"ExportRunRequestedContextSchema":{"description":"Context for an export run requested at a given scope.","properties":{"column_display_name":{"default":"","title":"Column Display Name","type":"string"},"integration_type":{"default":"","title":"Integration Type","type":"string"},"record_type":{"default":"","title":"Record Type","type":"string"},"run_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Run Id"},"scope":{"default":"","title":"Scope","type":"string"},"type":{"const":"export_run_requested","default":"export_run_requested","title":"Type","type":"string"}},"title":"ExportRunRequestedContextSchema","type":"object"},"ExportValueSource-Input":{"description":"The per-row value written into ONE destination field.\n\n``template`` reuses the enrichment prompt format verbatim: ordered text\nand column-reference segments, references stored by column identity so a\nrename can never silently repoint a mapping and a delete is detectable.\n\nPASSTHROUGH RULE: when the template is exactly one whole-cell column\nreference (one segment, no path), the RAW stored cell value is sent, not\nits rendered text, so a LIST cell reaches a multi-select property as a list\nand a NUMBER cell as a number. Any other shape (text around a reference,\ntwo references, a path) renders to a string, because concatenation only\nhas a string answer.","properties":{"template":{"$ref":"#/components/schemas/EnrichmentPromptTemplate"}},"title":"ExportValueSource","type":"object"},"ExportValueSource-Output":{"description":"The per-row value written into ONE destination field.\n\n``template`` reuses the enrichment prompt format verbatim: ordered text\nand column-reference segments, references stored by column identity so a\nrename can never silently repoint a mapping and a delete is detectable.\n\nPASSTHROUGH RULE: when the template is exactly one whole-cell column\nreference (one segment, no path), the RAW stored cell value is sent, not\nits rendered text, so a LIST cell reaches a multi-select property as a list\nand a NUMBER cell as a number. Any other shape (text around a reference,\ntwo references, a path) renders to a string, because concatenation only\nhas a string answer.","properties":{"template":{"$ref":"#/components/schemas/EnrichmentPromptTemplate"}},"title":"ExportValueSource","type":"object"},"ExportWriteAction":{"description":"What one export cell does at the destination.\n\nIts own vocabulary, not a copy of the integration stratum's\n``WriteBehavior``: the members and their values differ, and\n``table_export_integration`` translates between the two at the seam\n(``_WRITE_BEHAVIOR_TO_EXPORT_ACTION``). Mirroring has no member here\nbecause it deletes and recreates the whole destination object, which is a\nwhole-object concern rather than a per-row one.","enum":["create","update","upsert"],"title":"ExportWriteAction","type":"string"},"ExportWriteEstimateSchema":{"description":"One export column the run would fire, and how much it would write.","properties":{"action":{"description":"create, update or upsert: what happens to records that already exist at the destination.","title":"Action","type":"string"},"column_id":{"format":"uuid","title":"Column Id","type":"string"},"display_name":{"description":"The export column's name, for the confirmation copy.","title":"Display Name","type":"string"},"integration_type":{"description":"Destination provider slug, e.g. 'hubspot'.","title":"Integration Type","type":"string"},"record_type":{"description":"Destination object written, e.g. 'contacts'.","title":"Record Type","type":"string"},"rows":{"description":"Rows this column would attempt to write.","title":"Rows","type":"integer"}},"required":["column_id","display_name","integration_type","record_type","action","rows"],"title":"ExportWriteEstimateSchema","type":"object"},"FeedbackRating":{"description":"The human verdict on one message: a thumb, not a scale.","enum":["good","bad"],"title":"FeedbackRating","type":"string"},"FeedbackRoundState":{"description":"Where one note stands: being answered, learned, thrown away, or answered with no change.","enum":["pending","applied","discarded","settled"],"title":"FeedbackRoundState","type":"string"},"FeedbackSource":{"description":"Where a piece of feedback came from, which says how much it means.","enum":["approval_card","inbox_draft","agent_tab","approved_unchanged","positive_reply"],"title":"FeedbackSource","type":"string"},"FieldChangeSchema":{"description":"A single field change in an update.","properties":{"field":{"title":"Field","type":"string"},"new_value":{"title":"New Value"},"old_value":{"title":"Old Value"}},"required":["field","old_value","new_value"],"title":"FieldChangeSchema","type":"object"},"FlagFilterSchema":{"description":"A yes/no attribute. Omit the whole object, or its value, for \"don't care\".\n\nAn object around a single boolean, rather than a bare optional boolean,\nbecause the client keeps a draft of every filter as the user moves between\nmodules, and a toggle that has been set to \"no\" has to survive that trip\ndistinguishably from one that was never touched.","properties":{"value":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Value"}},"title":"FlagFilterSchema","type":"object"},"FollowContactOutcome":{"additionalProperties":false,"description":"What following a member produced: the common fields and the nine profile facts.\n\n``already_following`` re-read after the click is the verification.","properties":{"already_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Connected"},"already_following":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Following"},"can_send_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Send Message"},"found_already":{"anyOf":[{"$ref":"#/components/schemas/LinkedInFoundAlready"},{"type":"null"}]},"invitation_pending":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invitation Pending"},"kind":{"const":"follow_contact","default":"follow_contact","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"member_urns":{"items":{"maxLength":128,"type":"string"},"maxItems":8,"title":"Member Urns","type":"array"},"open_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Open Profile"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"profile_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Profile Resolved"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"vanity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity"}},"title":"FollowContactOutcome","type":"object"},"FollowContactParams":{"additionalProperties":false,"description":"Follow a member without connecting to them. ``profile_url`` is where the browser goes.","properties":{"kind":{"const":"follow_contact","default":"follow_contact","title":"Kind","type":"string"},"profile_url":{"maxLength":512,"title":"Profile Url","type":"string"}},"required":["profile_url"],"title":"FollowContactParams","type":"object"},"ForbiddenResponse":{"properties":{"detail":{"description":"The detail of why the request is forbidden.","title":"Detail","type":"string"}},"required":["detail"],"title":"ForbiddenResponse","type":"object"},"FormulaColumnDefinition-Input":{"description":"Definition of a formula column: a pure-function chain over other columns.","properties":{"chain":{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}],"title":"Chain"},"kind":{"const":"formula","default":"formula","title":"Kind","type":"string"}},"required":["chain"],"title":"FormulaColumnDefinition","type":"object"},"FormulaColumnDefinition-Output":{"description":"Definition of a formula column: a pure-function chain over other columns.","properties":{"chain":{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}],"title":"Chain"},"kind":{"const":"formula","default":"formula","title":"Kind","type":"string"}},"required":["chain"],"title":"FormulaColumnDefinition","type":"object"},"FunctionCatalogEntrySchema":{"description":"UI-facing metadata for one table function.","properties":{"category":{"$ref":"#/components/schemas/TableFunctionCategory"},"function":{"title":"Function","type":"string"},"label":{"title":"Label","type":"string"}},"required":["function","label","category"],"title":"FunctionCatalogEntrySchema","type":"object"},"FunctionCatalogResponseSchema":{"description":"The static catalog of every table function.","properties":{"functions":{"items":{"$ref":"#/components/schemas/FunctionCatalogEntrySchema"},"title":"Functions","type":"array"}},"required":["functions"],"title":"FunctionCatalogResponseSchema","type":"object"},"GateClause":{"description":"One comparison inside a :class:`TableConditions` step.\n\n``source`` is an ``Operand`` rather than a bare ``UUID`` deliberately, and\nthe dependency walk is the reason: ``chain_refs._walk_for_column_refs`` collects\n:class:`ColumnRef` instances reflectively wherever they are nested, but a\nbare UUID on a nested model is invisible to it. Spelled as an operand, a\nclause's column lands in ``run_condition_column_ids`` (and therefore in\nthe compute page's read projection) for free. Spelled as a UUID it would\nevaluate against a missing value on every row.\n\n``compare_value`` also admits a list of strings, which is what the two list\noperators take: the terms a filter panel collects as chips arrive exactly as\nthe row filter receives them, and a string holding ``\"a, b, c\"`` is read the\nsame way, so a hand-typed gate is not held to a stricter shape.","properties":{"compare_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Compare Value"},"operator":{"enum":["eq","neq","gt","lt","gte","lte","contains","not_contains","contains_any_of","not_contains_any_of","starts_with","is_empty","is_not_empty","is_true","is_false"],"title":"Operator","type":"string"},"source":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Source"}},"required":["operator"],"title":"GateClause","type":"object"},"GateGroup-Input":{"description":"A parenthesised run of clauses, joined among themselves.\n\nHolds clauses and never other groups: one level of nesting is expressible\nand a second is not, by construction rather than by validation. That is the\nrow filter's own rule (``TableRowFilterGroup``), adopted here for the same\nreason and one more: a filter can only be saved as a gate losslessly if the\ngate can say exactly what the filter says (``A and (B or C)``) and no\nmore, so nothing a gate expresses is ever unreadable as a filter.","properties":{"clauses":{"items":{"$ref":"#/components/schemas/GateClause"},"maxItems":8,"minItems":1,"title":"Clauses","type":"array"},"joiner":{"default":"and","enum":["and","or"],"title":"Joiner","type":"string"},"type":{"const":"group","default":"group","title":"Type","type":"string"}},"required":["clauses"],"title":"GateGroup","type":"object"},"GateGroup-Output":{"description":"A parenthesised run of clauses, joined among themselves.\n\nHolds clauses and never other groups: one level of nesting is expressible\nand a second is not, by construction rather than by validation. That is the\nrow filter's own rule (``TableRowFilterGroup``), adopted here for the same\nreason and one more: a filter can only be saved as a gate losslessly if the\ngate can say exactly what the filter says (``A and (B or C)``) and no\nmore, so nothing a gate expresses is ever unreadable as a filter.","properties":{"clauses":{"items":{"$ref":"#/components/schemas/GateClause"},"maxItems":8,"minItems":1,"title":"Clauses","type":"array"},"joiner":{"default":"and","enum":["and","or"],"title":"Joiner","type":"string"},"type":{"const":"group","default":"group","title":"Type","type":"string"}},"required":["clauses"],"title":"GateGroup","type":"object"},"GenerateDraftSchema":{"properties":{"steer_text":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"title":"Steer Text"}},"title":"GenerateDraftSchema","type":"object"},"GenerateEnrichmentColumnRequestSchema":{"description":"One sentence to turn into a draft AI-column configuration.","properties":{"instruction":{"description":"A plain-language description of the column to build.","maxLength":2000,"minLength":1,"title":"Instruction","type":"string"},"table_id":{"description":"The table whose columns the prompt may reference.","format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","instruction"],"title":"GenerateEnrichmentColumnRequestSchema","type":"object"},"GeoFilterSchema":{"description":"A place to search around: an address, or a point, plus a radius.\n\nSend whichever you have. An address is resolved to a point server-side,\nagainst Google Maps data, which any surface displaying the results must\ncredit to \"Google Maps\". An address that resolves to nothing is refused\nrather than dropped, so a search is never quietly run over the whole\nworld.","properties":{"address":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"description":"A street address, neighbourhood, postcode or city.","title":"Address"},"latitude":{"anyOf":[{"maximum":90.0,"minimum":-90.0,"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"maximum":180.0,"minimum":-180.0,"type":"number"},{"type":"null"}],"title":"Longitude"},"radius_km":{"anyOf":[{"maximum":500.0,"minimum":1.0,"type":"number"},{"type":"null"}],"description":"How far around the point to search, in whole KILOMETRES, at least 1. The data source takes an integer radius (its minimum is 1) and a fraction is rounded to the nearest kilometre.","title":"Radius Km"}},"title":"GeoFilterSchema","type":"object"},"GeocodedAddressResponseSchema":{"description":"Where an address is, so a builder can show the circle before it searches.\n\nCarries the address back with the point. The caller is a box the user is\nstill typing in, and an answer that arrives after the text has moved on is\nonly safe to draw if it says which text it answers.","properties":{"address":{"description":"The address that was resolved, trimmed. Echoed back so a late answer can be told from a current one.","title":"Address","type":"string"},"latitude":{"description":"Degrees north, between -90 and 90.","title":"Latitude","type":"number"},"longitude":{"description":"Degrees east, between -180 and 180.","title":"Longitude","type":"number"}},"required":["address","latitude","longitude"],"title":"GeocodedAddressResponseSchema","type":"object"},"GoogleConnectCallbackSchema":{"properties":{"code":{"title":"Code","type":"string"},"state":{"title":"State","type":"string"}},"required":["code","state"],"title":"GoogleConnectCallbackSchema","type":"object"},"GoogleConnectStartResponseSchema":{"properties":{"authorize_url":{"title":"Authorize Url","type":"string"}},"required":["authorize_url"],"title":"GoogleConnectStartResponseSchema","type":"object"},"GoogleConnectStartSchema":{"properties":{"login_hint":{"anyOf":[{"maxLength":320,"type":"string"},{"type":"null"}],"description":"Pre-select this account on Google's chooser, so a reconnect should land on the mailbox that broke, not whichever account the browser is signed into.","title":"Login Hint"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Attach the new mailbox to this profile on connect.","title":"Sender Profile Id"}},"title":"GoogleConnectStartSchema","type":"object"},"GoogleDriveConnectCallbackSchema":{"description":"What Google sent to the callback page.","properties":{"code":{"maxLength":2048,"minLength":1,"title":"Code","type":"string"},"state":{"maxLength":512,"minLength":1,"title":"State","type":"string"}},"required":["code","state"],"title":"GoogleDriveConnectCallbackSchema","type":"object"},"GoogleDriveConnectStartResponseSchema":{"description":"Where to send the browser to grant access.","properties":{"authorize_url":{"title":"Authorize Url","type":"string"}},"required":["authorize_url"],"title":"GoogleDriveConnectStartResponseSchema","type":"object"},"GoogleDriveConnectionReadSchema":{"description":"Whether the signed-in user has connected Drive in this workspace.\n\nAlways a 200, never a 404: the settings page is asking \"Connect, or pick?\"\nand both answers are ordinary.","properties":{"configured":{"description":"Whether this deployment has a Google Drive client at all. False means the Connect button should not be offered.","title":"Configured","type":"boolean"},"connected":{"title":"Connected","type":"boolean"},"connected_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Connected At"},"google_account_email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Which Google account is connected, for the caption.","title":"Google Account Email"}},"required":["configured","connected","google_account_email","connected_at"],"title":"GoogleDriveConnectionReadSchema","type":"object"},"GrowthFilterSchema":{"description":"Headcount growth over a chosen window, as a min/max percentage band.","properties":{"max_percent":{"anyOf":[{"maximum":10000.0,"minimum":-100.0,"type":"integer"},{"type":"null"}],"title":"Max Percent"},"min_percent":{"anyOf":[{"maximum":10000.0,"minimum":-100.0,"type":"integer"},{"type":"null"}],"title":"Min Percent"},"timespan":{"$ref":"#/components/schemas/GrowthTimespan","default":"12months"}},"title":"GrowthFilterSchema","type":"object"},"GrowthTimespan":{"description":"The window a headcount-growth percentage is measured over.\n\nThe company index measures the last month, quarter and year (added\n2026-09-16 for the first two); six and twenty-four months were the lead\ndatabase's windows and are refused by name on a company search.","enum":["1month","3months","6months","12months","24months"],"title":"GrowthTimespan","type":"string"},"HealthCheckFailureSchema":{"description":"A single failed integration in a bulk health check summary.","properties":{"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable error message from the latest check.","title":"Error Message"},"integration_id":{"format":"uuid","title":"Integration Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["integration_id","name"],"title":"HealthCheckFailureSchema","type":"object"},"HealthCheckReadSchema":{"description":"Response model for a single health check result.","properties":{"checked_at":{"description":"When the health check was performed.","format":"date-time","title":"Checked At","type":"string"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Machine-readable error code.","title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable error message.","title":"Error Message"},"id":{"format":"uuid","title":"Id","type":"string"},"status":{"$ref":"#/components/schemas/IntegrationHealthStatus","description":"Health check status: healthy, warning, or error."}},"required":["id","status","checked_at"],"title":"HealthCheckReadSchema","type":"object"},"HealthCheckSummaryRequestSchema":{"description":"Selection plus the run start time, for polling bulk health check progress.","properties":{"exclude_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":10000,"type":"array"},{"type":"null"}],"description":"Integration IDs to exclude from a filter-based (select-all) selection.","title":"Exclude Ids"},"filters":{"anyOf":[{"$ref":"#/components/schemas/ListIntegrationsFilterParamsSchema"},{"type":"null"}],"description":"Select-all: check every integration matching these filters (all pages)."},"ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":10000,"minItems":1,"type":"array"},{"type":"null"}],"description":"Explicit integration IDs to check (per-page selection).","title":"Ids"},"since":{"description":"Run start time. An integration counts as checked when its latest health check's checked_at is after this timestamp.","format":"date-time","title":"Since","type":"string"}},"required":["since"],"title":"HealthCheckSummaryRequestSchema","type":"object"},"HealthCheckSummaryResponseSchema":{"description":"Consolidated progress + result summary for a bulk health check run.","properties":{"checked":{"description":"How many have a completed check since the run started.","title":"Checked","type":"integer"},"error":{"description":"Count checked with an error since the run started.","title":"Error","type":"integer"},"failures":{"description":"The error integrations (bounded), for quick links to the failures.","items":{"$ref":"#/components/schemas/HealthCheckFailureSchema"},"title":"Failures","type":"array"},"healthy":{"description":"Count checked healthy since the run started.","title":"Healthy","type":"integer"},"total":{"description":"Total integrations in the selection.","title":"Total","type":"integer"},"warning":{"description":"Count checked with a warning since the run started.","title":"Warning","type":"integer"}},"required":["total","checked","healthy","warning","error","failures"],"title":"HealthCheckSummaryResponseSchema","type":"object"},"HealthChecksTriggeredResponseSchema":{"description":"Acknowledgement that background health checks were queued.","properties":{"count":{"description":"Number of health checks queued.","title":"Count","type":"integer"},"detail":{"title":"Detail","type":"string"},"since":{"description":"Server-generated run start time. Pass this back to the summary endpoint as `since` so progress is measured against the server clock (a client clock that is ahead of the server would otherwise leave every fresh check counted as stale).","format":"date-time","title":"Since","type":"string"}},"required":["detail","count","since"],"title":"HealthChecksTriggeredResponseSchema","type":"object"},"HeldBySequenceReadSchema":{"description":"The live sequence a skipped contact is in.","properties":{"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name"],"title":"HeldBySequenceReadSchema","type":"object"},"HelpScoutIdentity":{"description":"Who the Beacon should say is writing, and the proof that it is them.\n\nThe email is returned rather than read from Clerk in the browser because it\nis the string the signature was computed over: a Beacon handed a different\naddress than the one that was signed fails secure mode silently.","properties":{"company":{"description":"The workspace they are writing from.","title":"Company","type":"string"},"email":{"description":"The address the signature below was computed over.","title":"Email","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The customer's full name, or null when Clerk holds neither part.","title":"Name"},"org_id":{"description":"Clerk organization id, for looking the workspace up.","title":"Org Id","type":"string"},"role":{"description":"Their role in that workspace.","title":"Role","type":"string"},"signature":{"description":"HMAC-SHA256 hex signature of the email, which Beacon secure mode checks before it trusts the identity the page claims.","title":"Signature","type":"string"},"user_id":{"description":"Clerk user id, for looking the person up.","title":"User Id","type":"string"}},"required":["email","signature","name","company","role","user_id","org_id"],"title":"HelpScoutIdentity","type":"object"},"HiringCompaniesQuerySchema":{"description":"Filters for a search for companies with open roles matching a job title.\n\nThe rows are companies, one per employer, each carrying every open\nposting the search read for it. The count is of open postings, since the\ncompanies are folded from them once they are read.","properties":{"cities":{"description":"Cities the roles are based in. Up to 20.","items":{"type":"string"},"maxItems":20,"title":"Cities","type":"array"},"company_domains":{"description":"Only roles at these employers, by website domain. Up to 100.","items":{"type":"string"},"maxItems":100,"title":"Company Domains","type":"array"},"company_funded_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only employers whose last round closed on or after this day, as YYYY-MM-DD.","title":"Company Funded After"},"company_funding_amount":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The size of the employer's last round, in US dollars."},"company_funding_round_types":{"description":"The type of the employer's last funding round, for example Seed or Series A.","items":{"type":"string"},"maxItems":20,"title":"Company Funding Round Types","type":"array"},"company_technologies":{"description":"Only employers whose website runs one of these technologies, for example HubSpot. Up to 20.","items":{"type":"string"},"maxItems":20,"title":"Company Technologies","type":"array"},"countries":{"description":"Countries the roles are based in, by full name the way a posting spells it: United States, not US. Up to 20.","items":{"type":"string"},"maxItems":20,"title":"Countries","type":"array"},"departments":{"description":"The role's department, from the same list the people search uses, for example Sales or Engineering and Technical. Any other value is refused.","items":{"type":"string"},"maxItems":20,"title":"Departments","type":"array"},"employee_count":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The employer's headcount."},"industries":{"description":"Only employers in these industries, each matched as a phrase in the employer's industry name. Up to 25.","items":{"type":"string"},"maxItems":25,"title":"Industries","type":"array"},"job_functions":{"description":"The role's job functions, for example Sales, Information Technology or Software Development, each matched as a phrase. Up to 20.","items":{"type":"string"},"maxItems":20,"title":"Job Functions","type":"array"},"job_title":{"anyOf":[{"$ref":"#/components/schemas/JobTitleFilterSchema"},{"type":"null"}],"description":"Phrases an open posting's title must carry, any of them, up to 10 each way. A phrase is matched whole and in order: Identity Management matches Senior Identity Management Engineer and not Manager of Identity. At least one title or keyword phrase is required; nothing else can anchor a hiring search."},"keywords":{"anyOf":[{"$ref":"#/components/schemas/JobTitleFilterSchema"},{"type":"null"}],"description":"Phrases in the posting's description, matched the same way. The other way to anchor the search: companies whose openings mention Okta, whatever the role is called."},"posted_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only postings published on or after this day, as YYYY-MM-DD.","title":"Posted After"},"posted_before":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only postings published on or before this day, as YYYY-MM-DD.","title":"Posted Before"},"seniorities":{"description":"The role's seniority, from: Internship, Entry level, Associate, Mid-Senior level, Director, Executive or Not Applicable. Any other value is refused.","items":{"type":"string"},"maxItems":20,"title":"Seniorities","type":"array"},"states":{"description":"States or provinces the roles are based in, written out in full. Up to 20.","items":{"type":"string"},"maxItems":20,"title":"States","type":"array"}},"title":"HiringCompaniesQuerySchema","type":"object"},"HoldReason":{"description":"Why the send path pushed a live contact's ``due_at`` out instead of sending.\n\nStored beside the date it explains so the Contacts tab can say \"Approved,\nwindow opens in 3 hours\" rather than a bare date. Only ever meaningful on\nan ACTIVE row whose date is still ahead; any other write clears it.","enum":["window","approved_window","daily_cap","no_mailbox","pacing","agent_unavailable","no_message","agent_writing","agent_queued","mailbox_waiting","no_linkedin_account","confirming_send","email_check"],"title":"HoldReason","type":"string"},"HttpApiJwtSettings-Input":{"description":"Settings for the JWT-authenticated HTTP API action.\n\nSame request as :class:`HttpApiSettings` with the one thing that cannot be\nhand-written in a header: a JWT minted per run from the caller's own\nsecret, so the token in flight is short-lived instead of a permanent\ncredential pasted into a header field.","properties":{"body":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentPromptTemplate"},{"type":"string"}],"description":"Request body for POST/PUT/PATCH: text and column references, or a string in which {{Column name}} stands for that column's value in the row. Each value is escaped for the body's format, read off the Content-Type header (JSON, form or XML), or JSON when there is none and the body is JSON: inside a JSON string it is escaped text; outside one it is a single JSON value of the cell's own type."},"headers":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentPromptTemplate"},{"type":"string"}]},"description":"Sent with every row's request, e.g. an Authorization header. Each value is a template like the body: text and column references, or a string in which {{Column name}} stands for that column's value in the row.","maxProperties":20,"title":"Headers","type":"object"},"json_path":{"default":"","maxLength":200,"title":"Json Path","type":"string"},"jwt_claims":{"additionalProperties":{"type":"string"},"description":"Claims to sign, e.g. {'iss': 'oneprofile'}.","maxProperties":20,"title":"Jwt Claims","type":"object"},"jwt_header":{"default":"Authorization","description":"Which header carries the token.","maxLength":100,"title":"Jwt Header","type":"string"},"jwt_prefix":{"default":"Bearer ","description":"Prefix in front of the token, e.g. 'Bearer '.","maxLength":20,"title":"Jwt Prefix","type":"string"},"jwt_secret":{"default":"","description":"The shared secret the token is signed with (HS256).","maxLength":1000,"title":"Jwt Secret","type":"string"},"jwt_ttl_seconds":{"default":300,"description":"How long each minted token stays valid.","maximum":3600.0,"minimum":30.0,"title":"Jwt Ttl Seconds","type":"integer"},"kind":{"const":"http_api_jwt","default":"http_api_jwt","title":"Kind","type":"string"},"method":{"default":"GET","enum":["GET","POST","PUT","PATCH","DELETE"],"title":"Method","type":"string"}},"title":"HttpApiJwtSettings","type":"object"},"HttpApiJwtSettings-Output":{"description":"Settings for the JWT-authenticated HTTP API action.\n\nSame request as :class:`HttpApiSettings` with the one thing that cannot be\nhand-written in a header: a JWT minted per run from the caller's own\nsecret, so the token in flight is short-lived instead of a permanent\ncredential pasted into a header field.","properties":{"body":{"$ref":"#/components/schemas/EnrichmentPromptTemplate","description":"Request body for POST/PUT/PATCH: text and column references, or a string in which {{Column name}} stands for that column's value in the row. Each value is escaped for the body's format, read off the Content-Type header (JSON, form or XML), or JSON when there is none and the body is JSON: inside a JSON string it is escaped text; outside one it is a single JSON value of the cell's own type."},"headers":{"additionalProperties":{"$ref":"#/components/schemas/EnrichmentPromptTemplate"},"description":"Sent with every row's request, e.g. an Authorization header. Each value is a template like the body: text and column references, or a string in which {{Column name}} stands for that column's value in the row.","maxProperties":20,"title":"Headers","type":"object"},"json_path":{"default":"","maxLength":200,"title":"Json Path","type":"string"},"jwt_claims":{"additionalProperties":{"type":"string"},"description":"Claims to sign, e.g. {'iss': 'oneprofile'}.","maxProperties":20,"title":"Jwt Claims","type":"object"},"jwt_header":{"default":"Authorization","description":"Which header carries the token.","maxLength":100,"title":"Jwt Header","type":"string"},"jwt_prefix":{"default":"Bearer ","description":"Prefix in front of the token, e.g. 'Bearer '.","maxLength":20,"title":"Jwt Prefix","type":"string"},"jwt_secret":{"default":"","description":"The shared secret the token is signed with (HS256).","maxLength":1000,"title":"Jwt Secret","type":"string"},"jwt_ttl_seconds":{"default":300,"description":"How long each minted token stays valid.","maximum":3600.0,"minimum":30.0,"title":"Jwt Ttl Seconds","type":"integer"},"kind":{"const":"http_api_jwt","default":"http_api_jwt","title":"Kind","type":"string"},"method":{"default":"GET","enum":["GET","POST","PUT","PATCH","DELETE"],"title":"Method","type":"string"}},"title":"HttpApiJwtSettings","type":"object"},"HttpApiSettings-Input":{"description":"Settings for the HTTP API action: one request per row, described here.\n\nThe URL is the column's prompt, so it can carry ``{{column}}`` tokens the\nsame way every other prompt does and gets the same picker. Everything a\nURL cannot express lives here, and the body and header values carry\ncolumn references of the same kind (see ``HttpRequestTemplate``).\n\n``json_path`` is what turns a response into a CELL: an API answers with a\ndocument, and the column usually wants one value out of it. Dotted, with\ninteger segments indexing arrays: ``data.0.email``. Left empty the whole\ndecoded body lands in the cell.","properties":{"body":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentPromptTemplate"},{"type":"string"}],"description":"Request body for POST/PUT/PATCH: text and column references, or a string in which {{Column name}} stands for that column's value in the row. Each value is escaped for the body's format, read off the Content-Type header (JSON, form or XML), or JSON when there is none and the body is JSON: inside a JSON string it is escaped text; outside one it is a single JSON value of the cell's own type."},"headers":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentPromptTemplate"},{"type":"string"}]},"description":"Sent with every row's request, e.g. an Authorization header. Each value is a template like the body: text and column references, or a string in which {{Column name}} stands for that column's value in the row.","maxProperties":20,"title":"Headers","type":"object"},"json_path":{"default":"","description":"Dotted path to the value to keep, e.g. data.0.email.","maxLength":200,"title":"Json Path","type":"string"},"kind":{"const":"http_api","default":"http_api","title":"Kind","type":"string"},"method":{"default":"GET","enum":["GET","POST","PUT","PATCH","DELETE"],"title":"Method","type":"string"}},"title":"HttpApiSettings","type":"object"},"HttpApiSettings-Output":{"description":"Settings for the HTTP API action: one request per row, described here.\n\nThe URL is the column's prompt, so it can carry ``{{column}}`` tokens the\nsame way every other prompt does and gets the same picker. Everything a\nURL cannot express lives here, and the body and header values carry\ncolumn references of the same kind (see ``HttpRequestTemplate``).\n\n``json_path`` is what turns a response into a CELL: an API answers with a\ndocument, and the column usually wants one value out of it. Dotted, with\ninteger segments indexing arrays: ``data.0.email``. Left empty the whole\ndecoded body lands in the cell.","properties":{"body":{"$ref":"#/components/schemas/EnrichmentPromptTemplate","description":"Request body for POST/PUT/PATCH: text and column references, or a string in which {{Column name}} stands for that column's value in the row. Each value is escaped for the body's format, read off the Content-Type header (JSON, form or XML), or JSON when there is none and the body is JSON: inside a JSON string it is escaped text; outside one it is a single JSON value of the cell's own type."},"headers":{"additionalProperties":{"$ref":"#/components/schemas/EnrichmentPromptTemplate"},"description":"Sent with every row's request, e.g. an Authorization header. Each value is a template like the body: text and column references, or a string in which {{Column name}} stands for that column's value in the row.","maxProperties":20,"title":"Headers","type":"object"},"json_path":{"default":"","description":"Dotted path to the value to keep, e.g. data.0.email.","maxLength":200,"title":"Json Path","type":"string"},"kind":{"const":"http_api","default":"http_api","title":"Kind","type":"string"},"method":{"default":"GET","enum":["GET","POST","PUT","PATCH","DELETE"],"title":"Method","type":"string"}},"title":"HttpApiSettings","type":"object"},"IdentityFieldOptionSchema":{"description":"One key of the sampled records' ids, as a way to match rows across refreshes.","properties":{"editable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True when people can edit this field in the tool, so an edited record comes back as a new row; false when the tool sets it and it never changes; null when the tool does not say.","title":"Editable"},"field":{"description":"The key, as the tool names it. Send it as identity_field.","title":"Field","type":"string"},"filled":{"description":"How many sampled records carry a value for it.","title":"Filled","type":"integer"},"label":{"description":"The key's name for a person to read, e.g. 'Record ID'.","title":"Label","type":"string"},"problem":{"anyOf":[{"$ref":"#/components/schemas/IdentityFieldProblem"},{"type":"null"}],"description":"Why rows cannot be matched on it: `missing` when some records have no value, `shared` when two records hold the same one. Null when they can."},"sampled":{"description":"How many records were sampled.","title":"Sampled","type":"integer"},"unique":{"description":"Whether no two different sampled records share a value.","title":"Unique","type":"boolean"}},"required":["field","label","sampled","filled","unique","editable","problem"],"title":"IdentityFieldOptionSchema","type":"object"},"IdentityFieldProblem":{"description":"Why a key cannot match rows.\n\n``MISSING`` and ``SHARED`` are facts about values: some records (or rows)\nhave none, or two different ones hold the same. ``INEXACT`` is about how a\nvalue is stored: only text and whole numbers come back out of a row's\nstored record exactly as the provider sends them, and re-keying stored rows\non anything else would match nothing on the next refresh.","enum":["missing","shared","inexact"],"title":"IdentityFieldProblem","type":"string"},"IdentityVerificationReadSchema":{"description":"A freshly created hosted identity-verification flow.","properties":{"url":{"description":"Where to send the person to complete verification.","title":"Url","type":"string"}},"required":["url"],"title":"IdentityVerificationReadSchema","type":"object"},"ImportColumnMappingSchema":{"description":"How one CSV field should become one table column.","properties":{"column_type":{"$ref":"#/components/schemas/TableColumnType","description":"The type to create the column with."},"name":{"description":"The column's display name.","maxLength":255,"minLength":1,"title":"Name","type":"string"},"source_index":{"description":"The field's zero-based position in the file.","minimum":0.0,"title":"Source Index","type":"integer"}},"required":["source_index","name","column_type"],"title":"ImportColumnMappingSchema","type":"object"},"ImportColumnValuesDTO":{"properties":{"distribution":{"$ref":"#/components/schemas/ValueDistribution"},"name":{"title":"Name","type":"string"},"offset":{"title":"Offset","type":"integer"},"raw_values":{"items":{"type":"string"},"title":"Raw Values","type":"array"},"source_index":{"title":"Source Index","type":"integer"}},"required":["source_index","name","offset","raw_values","distribution"],"title":"ImportColumnValuesDTO","type":"object"},"ImportPreviewColumnSchema":{"description":"One column as inferred from the uploaded file.","properties":{"distribution":{"$ref":"#/components/schemas/ValueDistribution","description":"Exact raw value frequencies across the entire selected sheet or CSV, before row caps. Whitespace-only cells are empty; nonempty values are not coerced."},"inferred_type":{"$ref":"#/components/schemas/TableColumnType","description":"The type every sampled value fits."},"name":{"description":"Suggested column name, taken from the header row.","title":"Name","type":"string"},"sample_values":{"description":"A few raw values, to judge the guess by.","items":{"type":"string"},"title":"Sample Values","type":"array"},"source_index":{"description":"The field's zero-based position in the file.","title":"Source Index","type":"integer"}},"required":["source_index","name","inferred_type","sample_values","distribution"],"title":"ImportPreviewColumnSchema","type":"object"},"ImportRowErrorSchema":{"description":"One row the import could not write, and why.","properties":{"reason":{"description":"Which column rejected the value, and why.","title":"Reason","type":"string"},"row_number":{"description":"One-based data-row number in the file.","title":"Row Number","type":"integer"}},"required":["row_number","reason"],"title":"ImportRowErrorSchema","type":"object"},"ImportRowRangeSchema":{"description":"A run of the file's rows to import, both ends included.\n\nRows 21 to 30 are `{\"first\": 21, \"last\": 30}`, and one row is a range whose\nends are the same. The field that carries the ranges says how its rows are\nnumbered.","properties":{"first":{"description":"The first row of the range, counted from 1.","minimum":1.0,"title":"First","type":"integer"},"last":{"description":"The last row of the range; `first` for one row.","minimum":1.0,"title":"Last","type":"integer"}},"required":["first","last"],"title":"ImportRowRangeSchema","type":"object"},"ImportableIntegrationSchema":{"description":"A connected integration a table can import from.","properties":{"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider icon, for the picker.","title":"Icon Url"},"integration_id":{"description":"Pass this to preview and create.","format":"uuid","title":"Integration Id","type":"string"},"integration_type":{"description":"Provider slug, e.g. 'hubspot'.","title":"Integration Type","type":"string"},"name":{"description":"The connection's name, as the user named it.","title":"Name","type":"string"},"record_type_labels":{"additionalProperties":{"type":"string"},"description":"Each object type's name for a person to read, keyed by the stored value in `record_types`: sentence case, no underscores ('Event type').","title":"Record Type Labels","type":"object"},"record_types":{"description":"Object types this integration can list records of.","items":{"type":"string"},"title":"Record Types","type":"array"}},"required":["integration_id","integration_type","name","icon_url","record_types","record_type_labels"],"title":"ImportableIntegrationSchema","type":"object"},"InMailOutcome":{"additionalProperties":false,"description":"What sending an InMail produced: the common fields, the profile facts and the thread.\n\n``conversation_urn`` links the thread exactly as it does for a direct\nmessage: read off the composer for a new thread, and the one the step was\ngiven for a reply, where the profile facts stay ``None`` because the\nmessaging page shows no profile.","properties":{"already_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Connected"},"already_following":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Following"},"can_send_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Send Message"},"conversation_urn":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Conversation Urn"},"found_already":{"anyOf":[{"$ref":"#/components/schemas/LinkedInFoundAlready"},{"type":"null"}]},"invitation_pending":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invitation Pending"},"kind":{"const":"inmail","default":"inmail","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"member_urns":{"items":{"maxLength":128,"type":"string"},"maxItems":8,"title":"Member Urns","type":"array"},"open_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Open Profile"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"profile_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Profile Resolved"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"vanity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity"}},"title":"InMailOutcome","type":"object"},"InMailParams":{"additionalProperties":false,"description":"Send an InMail: a message with a subject line, priced against the sender's own credits.\n\nAddressed exactly like a direct message: a sequence step names the\ncontact's profile, an inbox reply names the thread, and the validator\nrequires one of the two. ``member_urn`` travels with a thread reply because\nthe messaging page shows no profile to read it off, and comes back\nunchanged on the outcome.\n\nThe subject has its own, much lower ceiling. Each text carries its length\nbefore clipping under the same rule as every other clipped field.","properties":{"body":{"maxLength":1900,"title":"Body","type":"string"},"body_original_length":{"default":0,"minimum":0.0,"title":"Body Original Length","type":"integer"},"conversation_urn":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Conversation Urn"},"kind":{"const":"inmail","default":"inmail","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"profile_url":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"title":"Profile Url"},"subject":{"default":"","maxLength":200,"title":"Subject","type":"string"},"subject_original_length":{"default":0,"minimum":0.0,"title":"Subject Original Length","type":"integer"}},"required":["body"],"title":"InMailParams","type":"object"},"InboxChannel":{"description":"Which surface a conversation happens on.\n\nThreads are contact-scoped, not channel-scoped, so this says how a thread is\nREACHED rather than partitioning the inbox: a reply arrives, is classified\nand stops the cadence identically either way, and only the send path differs.","enum":["email","linkedin"],"title":"InboxChannel","type":"string"},"InboxInvalidatedEventSchema":{"description":"The single inbox change-feed event: something changed, refetch what you show.\n\n``thread_id`` narrows the hint to one thread; None means the thread list\nitself changed. The frontend debounces and invalidates either way, so one\ncoalesced event kind is all the wire ever carries.","properties":{"thread_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Thread Id"}},"title":"InboxInvalidatedEventSchema","type":"object"},"InboxkitConnectPreviewResponseSchema":{"properties":{"workspaces":{"items":{"$ref":"#/components/schemas/InboxkitWorkspaceReadSchema"},"title":"Workspaces","type":"array"}},"required":["workspaces"],"title":"InboxkitConnectPreviewResponseSchema","type":"object"},"InboxkitConnectPreviewSchema":{"properties":{"api_key":{"maxLength":512,"minLength":8,"title":"Api Key","type":"string"}},"required":["api_key"],"title":"InboxkitConnectPreviewSchema","type":"object"},"InboxkitConnectSchema":{"properties":{"api_key":{"maxLength":512,"minLength":8,"title":"Api Key","type":"string"},"workspace_id":{"maxLength":64,"minLength":1,"title":"Workspace Id","type":"string"}},"required":["api_key","workspace_id"],"title":"InboxkitConnectSchema","type":"object"},"InboxkitConnectionReadSchema":{"properties":{"auto_disconnect_enabled":{"title":"Auto Disconnect Enabled","type":"boolean"},"auto_import_enabled":{"title":"Auto Import Enabled","type":"boolean"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"workspace_id":{"title":"Workspace Id","type":"string"},"workspace_name":{"title":"Workspace Name","type":"string"}},"required":["workspace_id","workspace_name","auto_import_enabled","auto_disconnect_enabled","created_at","updated_at"],"title":"InboxkitConnectionReadSchema","type":"object"},"InboxkitConnectionStatusSchema":{"description":"Always-200 connection state.\n\n\"Not connected\" is an ordinary state the dialog branches on, not an error.\nAnswering it with a 404 would be indistinguishable from a transient failure\non the client, and a transient failure must never present the connect form\nover a working connection.","properties":{"active_import_run":{"anyOf":[{"$ref":"#/components/schemas/InboxkitImportRunReadSchema"},{"type":"null"}]},"connected":{"title":"Connected","type":"boolean"},"connection":{"anyOf":[{"$ref":"#/components/schemas/InboxkitConnectionReadSchema"},{"type":"null"}]}},"required":["connected","connection"],"title":"InboxkitConnectionStatusSchema","type":"object"},"InboxkitConnectionUpdateSchema":{"properties":{"auto_disconnect_enabled":{"anyOf":[{"type":"boolean"},{}],"title":"Auto Disconnect Enabled"},"auto_import_enabled":{"anyOf":[{"type":"boolean"},{}],"title":"Auto Import Enabled"}},"title":"InboxkitConnectionUpdateSchema","type":"object"},"InboxkitDomainReadSchema":{"properties":{"authorized_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Authorized At"},"delegation_status":{"$ref":"#/components/schemas/DomainDelegationStatus"},"domain_name":{"title":"Domain Name","type":"string"},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["domain_name","delegation_status","status_reason","authorized_at","updated_at"],"title":"InboxkitDomainReadSchema","type":"object"},"InboxkitDomainsResponseSchema":{"properties":{"domains":{"items":{"$ref":"#/components/schemas/InboxkitDomainReadSchema"},"title":"Domains","type":"array"}},"required":["domains"],"title":"InboxkitDomainsResponseSchema","type":"object"},"InboxkitImportResponseSchema":{"properties":{"domains_authorizing":{"items":{"type":"string"},"title":"Domains Authorizing","type":"array"},"imported_now":{"title":"Imported Now","type":"integer"},"run_id":{"format":"uuid","title":"Run Id","type":"string"}},"required":["imported_now","domains_authorizing","run_id"],"title":"InboxkitImportResponseSchema","type":"object"},"InboxkitImportRunDetailReadSchema":{"properties":{"failed_count":{"title":"Failed Count","type":"integer"},"finished_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished At"},"id":{"format":"uuid","title":"Id","type":"string"},"imported_count":{"title":"Imported Count","type":"integer"},"items":{"items":{"$ref":"#/components/schemas/InboxkitImportRunItemReadSchema"},"title":"Items","type":"array"},"requested_count":{"title":"Requested Count","type":"integer"},"skipped_count":{"title":"Skipped Count","type":"integer"},"started_at":{"format":"date-time","title":"Started At","type":"string"},"status":{"$ref":"#/components/schemas/InboxkitImportRunStatus"},"trigger":{"$ref":"#/components/schemas/InboxkitImportRunTrigger"}},"required":["id","trigger","status","requested_count","imported_count","skipped_count","failed_count","started_at","finished_at","items"],"title":"InboxkitImportRunDetailReadSchema","type":"object"},"InboxkitImportRunItemReadSchema":{"properties":{"domain_name":{"title":"Domain Name","type":"string"},"email_address":{"title":"Email Address","type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"status":{"$ref":"#/components/schemas/InboxkitImportRunItemStatus"}},"required":["email_address","domain_name","status","reason"],"title":"InboxkitImportRunItemReadSchema","type":"object"},"InboxkitImportRunItemStatus":{"description":"One requested mailbox's outcome within an import run.\n\nPENDING items sit on an already-authorized domain awaiting the synchronous\nimport; AUTHORIZING items wait on their domain's delegation handshake. The\nterminal states: IMPORTED connected, SKIPPED_UNLISTED vanished from\nInboxKit's inventory between request and import, FAILED carries a reason.","enum":["pending","authorizing","imported","skipped_unlisted","failed"],"title":"InboxkitImportRunItemStatus","type":"string"},"InboxkitImportRunReadSchema":{"properties":{"failed_count":{"title":"Failed Count","type":"integer"},"finished_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished At"},"id":{"format":"uuid","title":"Id","type":"string"},"imported_count":{"title":"Imported Count","type":"integer"},"requested_count":{"title":"Requested Count","type":"integer"},"skipped_count":{"title":"Skipped Count","type":"integer"},"started_at":{"format":"date-time","title":"Started At","type":"string"},"status":{"$ref":"#/components/schemas/InboxkitImportRunStatus"},"trigger":{"$ref":"#/components/schemas/InboxkitImportRunTrigger"}},"required":["id","trigger","status","requested_count","imported_count","skipped_count","failed_count","started_at","finished_at"],"title":"InboxkitImportRunReadSchema","type":"object"},"InboxkitImportRunStatus":{"description":"Where one import request stands.\n\nRUNNING until every item reaches a terminal state; then SUCCEEDED when\neverything imported, FAILED when nothing did, PARTIAL for the mix. Status\nand counts are always derived from items. Three independent paths (the\nsynchronous import, the authorize workflow's import, and its failure\nbranches) finalize items, so denormalized counters would drift.","enum":["running","succeeded","partial","failed"],"title":"InboxkitImportRunStatus","type":"string"},"InboxkitImportRunTrigger":{"description":"Who asked for the import: a person in the picker, or the hourly sweep.","enum":["manual","auto"],"title":"InboxkitImportRunTrigger","type":"string"},"InboxkitImportSchema":{"properties":{"daily_send_limit":{"anyOf":[{"maximum":2000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"title":"Daily Send Limit"},"email_addresses":{"items":{"type":"string"},"maxItems":1000,"minItems":1,"title":"Email Addresses","type":"array"}},"required":["email_addresses"],"title":"InboxkitImportSchema","type":"object"},"InboxkitInventoryDomainReadSchema":{"properties":{"delegation_status":{"$ref":"#/components/schemas/DomainDelegationStatus"},"domain_name":{"title":"Domain Name","type":"string"},"mailboxes":{"items":{"$ref":"#/components/schemas/InboxkitInventoryMailboxReadSchema"},"title":"Mailboxes","type":"array"},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason"}},"required":["domain_name","delegation_status","status_reason","mailboxes"],"title":"InboxkitInventoryDomainReadSchema","type":"object"},"InboxkitInventoryMailboxReadSchema":{"properties":{"email_address":{"title":"Email Address","type":"string"},"imported":{"description":"True when this mailbox is connected in this workspace. One imported before and disconnected since is false, so it can be imported again.","title":"Imported","type":"boolean"},"vendor_status":{"title":"Vendor Status","type":"string"}},"required":["email_address","vendor_status","imported"],"title":"InboxkitInventoryMailboxReadSchema","type":"object"},"InboxkitInventoryResponseSchema":{"properties":{"domains":{"items":{"$ref":"#/components/schemas/InboxkitInventoryDomainReadSchema"},"title":"Domains","type":"array"}},"required":["domains"],"title":"InboxkitInventoryResponseSchema","type":"object"},"InboxkitRemovalResultReadSchema":{"properties":{"mailboxes_deleted":{"title":"Mailboxes Deleted","type":"integer"},"mailboxes_disconnected":{"title":"Mailboxes Disconnected","type":"integer"},"mailboxes_missing":{"title":"Mailboxes Missing","type":"integer"}},"required":["mailboxes_disconnected","mailboxes_deleted","mailboxes_missing"],"title":"InboxkitRemovalResultReadSchema","type":"object"},"InboxkitRemoveEverythingSchema":{"properties":{"mailbox_action":{"$ref":"#/components/schemas/MailboxRemovalAction"}},"required":["mailbox_action"],"title":"InboxkitRemoveEverythingSchema","type":"object"},"InboxkitWorkspaceReadSchema":{"properties":{"name":{"title":"Name","type":"string"},"workspace_id":{"title":"Workspace Id","type":"string"}},"required":["workspace_id","name"],"title":"InboxkitWorkspaceReadSchema","type":"object"},"IntegrationAuditAction":{"description":"Action types for integration audit logs.","enum":["created","updated","deleted"],"title":"IntegrationAuditAction","type":"string"},"IntegrationAuditLogReadSchema":{"description":"Read schema for integration audit log.","properties":{"action":{"$ref":"#/components/schemas/IntegrationAuditAction"},"actor":{"title":"Actor","type":"string"},"actor_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Display Name"},"actor_type":{"$ref":"#/components/schemas/ActorKind"},"context":{"discriminator":{"mapping":{"created":"#/components/schemas/IntegrationCreatedContextSchema","deleted":"#/components/schemas/IntegrationDeletedContextSchema","updated":"#/components/schemas/IntegrationUpdatedContextSchema"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/IntegrationCreatedContextSchema"},{"$ref":"#/components/schemas/IntegrationUpdatedContextSchema"},{"$ref":"#/components/schemas/IntegrationDeletedContextSchema"}],"title":"Context"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"integration_id":{"format":"uuid","title":"Integration Id","type":"string"}},"required":["id","integration_id","action","actor_type","actor","context","created_at"],"title":"IntegrationAuditLogReadSchema","type":"object"},"IntegrationConnectMethod":{"description":"How a user connects an integration in the UI.\n\nExtensible: as app listings gain non-OAuth connect flows (e.g. install-bound URL secret,\nper-install signature), add members here rather than another boolean.\n\nAn integration *type* can advertise more than one of these (see\n``IntegrationTypeRead.connect_methods``); a specific *connection* records the single method it\nwas created with on ``IntegrationModel.connect_method``.","enum":["oauth_connect","credentials_form"],"title":"IntegrationConnectMethod","type":"string"},"IntegrationCount":{"description":"Response model for Count Integrations endpoint.","properties":{"count":{"description":"The number of integrations for the organization.","title":"Count","type":"integer"}},"required":["count"],"title":"IntegrationCount","type":"object"},"IntegrationCreatedContextSchema":{"description":"Context for integration creation.","properties":{"config":{"additionalProperties":true,"title":"Config","type":"object"},"integration_type":{"title":"Integration Type","type":"string"},"name":{"title":"Name","type":"string"},"type":{"const":"created","default":"created","title":"Type","type":"string"}},"required":["name","integration_type"],"title":"IntegrationCreatedContextSchema","type":"object"},"IntegrationDeletedContextSchema":{"description":"Context for integration deletion.","properties":{"config":{"additionalProperties":true,"title":"Config","type":"object"},"integration_type":{"title":"Integration Type","type":"string"},"name":{"title":"Name","type":"string"},"type":{"const":"deleted","default":"deleted","title":"Type","type":"string"}},"required":["name","integration_type"],"title":"IntegrationDeletedContextSchema","type":"object"},"IntegrationHealthStatus":{"enum":["healthy","warning","error"],"title":"IntegrationHealthStatus","type":"string"},"IntegrationKindFilter":{"description":"Query filter: source-only, destination-only, or both.","enum":["source","destination","both"],"title":"IntegrationKindFilter","type":"string"},"IntegrationLookupSettings":{"description":"Settings for the connected-integration record lookup: which record, where.\n\nThe identity VALUE is not here. It arrives per row through the action's\nbound input column, like ``resolve_hostname``'s hostname. What a column\nfixes is the address: which of the org's connections to ask\n(``integration_id``: an ID, not a name, because two connections to one\nsystem are two different destinations), which record type, and which of\nthe SDK's declared identity fields the value keys on.\n\nAll three are plain identifiers rather than integration-stratum types on\npurpose: this module sits in the table stratum, which may not import the\nintegration domain, so the executor (which lives above both) resolves and\nvalidates them at run time. ``identity_field`` defaults empty so a\nhalf-configured draft can be saved; the executor skips such a column\nrather than guessing a key.","properties":{"identity_field":{"default":"","description":"The identity field the bound value keys on, e.g. 'id' or 'email'.","maxLength":255,"title":"Identity Field","type":"string"},"integration_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The org's connection to read from.","title":"Integration Id"},"kind":{"const":"integration_lookup","default":"integration_lookup","title":"Kind","type":"string"},"record_type":{"default":"","description":"The record type to fetch, e.g. 'user' or 'organization'.","maxLength":255,"title":"Record Type","type":"string"}},"title":"IntegrationLookupSettings","type":"object"},"IntegrationRead":{"description":"Response model for List Integrations endpoint.\n\nThis model specifically does not include the config field. Use the integration specific read\nmodel whenever possible.","properties":{"connect_method":{"$ref":"#/components/schemas/IntegrationConnectMethod","default":"credentials_form","description":"How this connection authenticates: 'credentials_form' (API-key form) or 'oauth_connect' (one-click app-listing OAuth). Gates the switch/reconnect surfaces in the UI."},"created_at":{"format":"date-time","title":"Created At","type":"string"},"created_by_actor_type":{"$ref":"#/components/schemas/ActorKind","description":"Type of actor that created this integration: 'user', 'api', or 'system'."},"created_by_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Display name of the creator. User's full name or 'API - {key name}'.","title":"Created By Display Name"},"health_checked_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the latest health check was performed.","title":"Health Checked At"},"health_error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Machine-readable error code from the latest health check (e.g. 'unauthorized', 'insufficient_permissions', 'rate_limited'). Drives the 'Action required: reauthorize' state and Reconnect CTA when it is 'unauthorized' or 'insufficient_permissions'. Null if never checked or healthy.","title":"Health Error Code"},"health_error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Error message from the latest health check, if unhealthy.","title":"Health Error Message"},"health_status":{"anyOf":[{"$ref":"#/components/schemas/IntegrationHealthStatus"},{"type":"null"}],"description":"Latest health check status: healthy, warning, or error. Null if never checked."},"id":{"format":"uuid","title":"Id","type":"string"},"integration_type":{"description":"The type of the integration.","title":"Integration Type","type":"string"},"kind":{"$ref":"#/components/schemas/IntegrationKindFilter","description":"Indicates if the integration is a source, destination, or both."},"name":{"description":"The name of the integration as defined by the user.","title":"Name","type":"string"},"org_id":{"title":"Org Id","type":"string"},"record_types":{"description":"Record types this integration supports, as display-ready chips matching the Data tab. Wildcard integrations also include a 'Custom' marker.","items":{"$ref":"#/components/schemas/IntegrationRecordTypeReadSchema"},"title":"Record Types","type":"array"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","org_id","integration_type","name","kind","created_at","updated_at","created_by_actor_type"],"title":"IntegrationRead","type":"object"},"IntegrationRecordTypeReadSchema":{"description":"A record type an integration handles, with a display-ready name.\n\nShared by the integrations list, the directory, and the record-type vocabulary endpoint so\nrecord-type chips render the same way everywhere.","properties":{"display_name":{"description":"Human-readable name (e.g. 'Person', 'Contacts', 'Custom').","title":"Display Name","type":"string"},"is_custom":{"description":"True for the wildcard 'Custom' marker (arbitrary/dynamic record types).","title":"Is Custom","type":"boolean"},"slug":{"description":"The record-type slug (e.g. 'person', 'contacts'), or '*' for Custom.","title":"Slug","type":"string"}},"required":["slug","display_name","is_custom"],"title":"IntegrationRecordTypeReadSchema","type":"object"},"IntegrationTypeGuideReadSchema":{"description":"Setup guide for an integration type.","properties":{"content":{"description":"Full guide content as markdown.","title":"Content","type":"string"},"integration_type":{"description":"The integration type slug (e.g., 'stripe').","title":"Integration Type","type":"string"}},"required":["integration_type","content"],"title":"IntegrationTypeGuideReadSchema","type":"object"},"IntegrationTypeRead":{"description":"Integration type metadata for the directory listing.","properties":{"categories":{"description":"e.g. ['CRM', 'Marketing Automation']","items":{"type":"string"},"title":"Categories","type":"array"},"company_domain":{"description":"e.g. 'google.com', 'intercom.com'","title":"Company Domain","type":"string"},"config_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"OpenAPI schema for connection settings. None if not implemented.","title":"Config Schema"},"connect_methods":{"description":"The ways a user can connect this integration. Contains 'oauth_connect' when an app-listing OAuth manifest exists, and 'credentials_form' when the SDK exposes a non-empty (API-key) credentials form. A single-method type returns exactly one entry (the UI renders as before); a type supporting both returns both (the UI shows a chooser). Empty for unimplemented types.","items":{"$ref":"#/components/schemas/IntegrationConnectMethod"},"title":"Connect Methods","type":"array"},"created_at":{"description":"When added to directory","format":"date-time","title":"Created At","type":"string"},"credentials_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"OpenAPI schema for auth credentials. None if not implemented.","title":"Credentials Schema"},"description":{"description":"What the integration does, shown in detail view","title":"Description","type":"string"},"display_name":{"description":"UI label. e.g. 'Google Sheets'","title":"Display Name","type":"string"},"icon_url":{"description":"Full URL to icon. e.g. 'https://static.../intercom.svg'","title":"Icon Url","type":"string"},"id":{"description":"Unique ID. e.g. '123e4567-e89b-12d3-a456-426614174000'","format":"uuid","title":"Id","type":"string"},"implemented":{"description":"False = coming soon, can't connect yet","title":"Implemented","type":"boolean"},"integration_type":{"description":"Unique ID. e.g. 'googlesheets', 'intercom'","title":"Integration Type","type":"string"},"is_marketplace_listing":{"default":false,"description":"True when this integration has a marketplace app-listing (OAuth-connect or credentials-form). Orthogonal to connect_method: the directory renders a 'Connect <X>' button for a marketplace listing even when connect_method is 'credentials_form'. Derived from the app-listings catalog.","title":"Is Marketplace Listing","type":"boolean"},"kind":{"$ref":"#/components/schemas/IntegrationKindFilter","default":"both","description":"'source', 'destination', or 'both'"},"name":{"description":"Sort key. e.g. 'Google Sheets', 'Intercom'","title":"Name","type":"string"},"overview":{"description":"Brief overview of the integration's sync capabilities","title":"Overview","type":"string"},"record_types":{"description":"Record types this integration syncs, as display-ready chips. Empty for 'coming soon' integrations. Wildcard integrations include a 'Custom' marker.","items":{"$ref":"#/components/schemas/IntegrationRecordTypeReadSchema"},"title":"Record Types","type":"array"},"tagline":{"description":"Short tagline naming key data objects synced","title":"Tagline","type":"string"},"updated_at":{"description":"Last metadata update","format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","integration_type","display_name","company_domain","categories","description","tagline","overview","icon_url","implemented","config_schema","credentials_schema","created_at","updated_at"],"title":"IntegrationTypeRead","type":"object"},"IntegrationUpdatedContextSchema":{"description":"Context for integration update.","properties":{"changes":{"items":{"$ref":"#/components/schemas/FieldChangeSchema"},"title":"Changes","type":"array"},"type":{"const":"updated","default":"updated","title":"Type","type":"string"}},"required":["changes"],"title":"IntegrationUpdatedContextSchema","type":"object"},"InviteOutcome":{"description":"Why a contact left a connection request by the branch it took.\n\nStored as the condition evaluation's ``reason`` beside the branch, because\nthe branch alone does not say enough: Not accepted covers an invitation\nthat expired, one that was declined, one nobody can answer any more, and\na request that could never be sent at all. The values up to\n``SENDER_CHANGED`` are answers (``ALREADY_CONNECTED`` the one known before\nany request went out); every value after it is a reason no request went\nout, and each one takes Not accepted.\n\n``ACCEPTED`` and ``ALREADY_CONNECTED`` take the Connected branch, the\nlatter its own branch when the request gives already-connected contacts\none. ``EXPIRED`` is an invitation still pending when its window closed,\n``DECLINED`` one a reading of the profile showed gone without a\nconnection (declined, or withdrawn by hand). ``SENDER_CHANGED`` is one\nnobody can answer any more: the sender's LinkedIn account was bound to\nanother member, or deleted, after it went out.","enum":["accepted","already_connected","expired","declined","sender_changed","connect_not_offered","email_required","profile_not_resolved","vanity_changed","skipped_in_panel","missed_window","not_sent","no_linkedin_url","own_profile"],"title":"InviteOutcome","type":"string"},"InvoiceReadSchema":{"description":"One invoice in the organization's transaction history.","properties":{"amount_due":{"description":"The amount due in cents.","title":"Amount Due","type":"integer"},"amount_paid":{"description":"The amount paid in cents.","title":"Amount Paid","type":"integer"},"created":{"description":"When the invoice was created.","format":"date-time","title":"Created","type":"string"},"currency":{"description":"The three-letter ISO currency code.","title":"Currency","type":"string"},"hosted_invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL of the hosted invoice page. None for draft invoices.","title":"Hosted Invoice Url"},"id":{"description":"The Stripe invoice ID.","title":"Id","type":"string"},"invoice_pdf":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL of the invoice PDF. None for draft invoices.","title":"Invoice Pdf"},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The customer-facing invoice number. None until finalized.","title":"Number"},"status":{"description":"The invoice status.","enum":["draft","open","paid","uncollectible","void"],"title":"Status","type":"string"}},"required":["id","status","number","amount_due","amount_paid","currency","created","hosted_invoice_url","invoice_pdf"],"title":"InvoiceReadSchema","type":"object"},"JobTitleFilterSchema":{"description":"A phrase filter over job postings, capped at ten phrases each way.","properties":{"exclude":{"items":{"type":"string"},"maxItems":10,"title":"Exclude","type":"array"},"include":{"items":{"type":"string"},"maxItems":10,"title":"Include","type":"array"}},"title":"JobTitleFilterSchema","type":"object"},"JourneyAction":{"enum":["stop","pause","resume","retry","send_now"],"type":"string"},"LabelCreateSchema":{"properties":{"color":{"default":"default","maxLength":16,"minLength":1,"title":"Color","type":"string"},"filtered_out":{"default":false,"title":"Filtered Out","type":"boolean"},"icon":{"default":"","maxLength":32,"title":"Icon","type":"string"},"name":{"maxLength":64,"minLength":1,"title":"Name","type":"string"},"track_as_positives":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Track As Positives"}},"required":["name"],"title":"LabelCreateSchema","type":"object"},"LabelReadSchema":{"properties":{"color":{"title":"Color","type":"string"},"filtered_out":{"default":false,"title":"Filtered Out","type":"boolean"},"icon":{"default":"","title":"Icon","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"is_seeded":{"default":false,"title":"Is Seeded","type":"boolean"},"name":{"title":"Name","type":"string"},"thread_count":{"title":"Thread Count","type":"integer"},"track_as_positives":{"default":false,"title":"Track As Positives","type":"boolean"}},"required":["id","name","color","thread_count"],"title":"LabelReadSchema","type":"object"},"LabelUpdateSchema":{"description":"Partial update of a label.\n\n`name` renames (seeded labels refuse, because their name is a contract);\n`track_as_positives` opts the label's threads in or out of the positive\nrate; `filtered_out` moves them out of (or back into) the working views.\nAll allowed on any label.","properties":{"filtered_out":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Filtered Out"},"name":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"title":"Name"},"track_as_positives":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Track As Positives"}},"title":"LabelUpdateSchema","type":"object"},"LeadAttachedTableListResponseSchema":{"description":"Which of an organisation's tables already carry a lead search.\n\nExists so a table picker can rule those out while the user is choosing.\nA table holds at most one search, and the alternative to answering this\nquestion up front is refusing the choice after the confirm, once the\nperson has already made it.\n\nIt lives here rather than on the table listing because a lead search is\nthis package's fact about a table, not the table's own.","properties":{"table_ids":{"description":"The tables that already have a search. Show these as unavailable in a picker, with the reason on the row, rather than letting one be chosen and then refused. The whole set for the organisation, not a page of it, so a picker can check membership as the person scrolls.","items":{"format":"uuid","type":"string"},"title":"Table Ids","type":"array"}},"required":["table_ids"],"title":"LeadAttachedTableListResponseSchema","type":"object"},"LeadColumnKind":{"description":"How a column's values are shown: a \"url\" as a link, a \"date\" as a date, a \"list\" as its items.\n\nA display hint, not the type the column stores.","enum":["text","number","url","date","boolean","list"],"title":"LeadColumnKind","type":"string"},"LeadColumnPlanResponseSchema":{"description":"The columns a search would create, so a header can be drawn before any rows are bought.","properties":{"columns":{"description":"Every column a table built from this search type can show, in order. A column that no added lead fills is left out when the table is created; a preview, which has leads in hand, lists only the columns they fill.","items":{"$ref":"#/components/schemas/LeadColumnSchema"},"title":"Columns","type":"array"},"credits_per_request":{"default":0,"title":"Credits Per Request","type":"number"},"credits_per_row":{"description":"What one row of this search type costs, in credits, before any enrichment is chosen. Zero for the search types whose rows are free. Charged on the rows a run adds, so a run that adds nothing costs nothing. Quoted here because this is the one free call a builder makes before anything is spent: asking the price must never itself cost a row.","title":"Credits Per Row","type":"number"},"preview_supported":{"description":"Whether this search type can be sampled before it is added. The backend lists which datasets offer an explicit sample. This is independent of row pricing; automatic counts are only available when the data source counts for free.","title":"Preview Supported","type":"boolean"},"rows_per_request":{"default":1000,"title":"Rows Per Request","type":"integer"}},"required":["columns","credits_per_row","preview_supported"],"title":"LeadColumnPlanResponseSchema","type":"object"},"LeadColumnSchema":{"description":"One column of the table a search would create, and whether a preview shows it.","properties":{"kind":{"$ref":"#/components/schemas/LeadColumnKind","description":"How to show the values: text, number, url, date, boolean or list. A hint for drawing the header, not a promise about every cell."},"label":{"description":"The column's name, as the created table will call it.","title":"Label","type":"string"},"revealed":{"description":"Whether a preview carries this column's values. A column that is not revealed has no value in a preview row at all, rather than a hidden one, so there is nothing to blur on the page.","title":"Revealed","type":"boolean"}},"required":["label","kind","revealed"],"title":"LeadColumnSchema","type":"object"},"LeadCountResponseSchema":{"description":"How many leads matched, and the most one search may add.","properties":{"at_capacity":{"default":false,"description":"Whether `total` is the most one run of this search can return rather than a real match count. True means at least that many match, so show the number as a floor (“100+ companies match”) and say that one run returns up to `max_rows_per_import` of them. False means `total` is the real tally, however far above the run limit it sits.","title":"At Capacity","type":"boolean"},"max_rows_per_import":{"description":"The most rows one import adds for THIS organisation: the source's ceiling clamped by the plan's rows per table. Always a number, so anything quoting an import prices against this.","title":"Max Rows Per Import","type":"integer"},"max_rows_per_search":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The data source's own ceiling on one search, before the plan. Null when the source has no ceiling of its own (the people and company searches) and the plan's rows per table is the only bound; a number on the searches whose rows are bought from a data source with a small pool.","title":"Max Rows Per Search"},"provider_notices":{"description":"What qualifies this count, in the words to show beside it. A lookalike search with a minimum similarity fills this: the floor is applied to the matches once they arrive, after this count was taken, so the search can add fewer rows than `total`. Empty for every count that is exact.","items":{"type":"string"},"title":"Provider Notices","type":"array"},"row_order":{"description":"Which matches one run keeps when more match than it can add. `ranked` means it keeps the closest matches, so the rows added are the best ones. `recent` means it keeps the newest. `source_order` means it keeps the first `max_rows_per_import` the search returns, which is not a quality order and should never be described as one. Worth showing whenever `total` is larger than `max_rows_per_import`, so a five-row sample can be read for what it is.","enum":["ranked","recent","source_order"],"title":"Row Order","type":"string"},"supported":{"default":true,"description":"Whether counting is available for this search type. False means `total` is null for every set of filters, not just this one.","title":"Supported","type":"boolean"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How many leads match. Null when this search type has no live count: buying-signal searches are sold by the row and have no free tally behind them, so the only way to see what one finds is to preview it. Lookalike, map and technographic searches all do count.","title":"Total"}},"required":["total","max_rows_per_search","max_rows_per_import","row_order"],"title":"LeadCountResponseSchema","type":"object"},"LeadEnrichmentOption":{"description":"An enrichment offered at import, in the user's vocabulary not the catalog's.\n\nEach option names an outcome and resolves to the curated enrichment that\ndelivers it, so importing leads stays a question about what you want\nrather than about who supplies it.\n\nKept as its own enum rather than reusing the capability keys directly:\nthe import page offers a deliberately short list, and which enrichments\nbelong on it is a product decision that should not change every time the\ncatalog gains a capability.","enum":["find_email","find_phone","enrich_contact","enrich_company"],"title":"LeadEnrichmentOption","type":"string"},"LeadEnrichmentOptionListResponseSchema":{"description":"The enrichments offered for one record type, and what the rows themselves cost.","properties":{"options":{"items":{"$ref":"#/components/schemas/LeadEnrichmentOptionSchema"},"title":"Options","type":"array"},"row_cost":{"$ref":"#/components/schemas/LeadRowCostSchema","description":"What the rows cost on top of the enrichments chosen for them. Add it to the ticked options to quote an import: before this existed the screen quoted an enrichment subtotal and called it the total, which under-quoted every buying-signal and lookalike import by the larger half."},"unavailable_options":{"description":"Enrichments that apply to this search but are not available right now, for any workspace. Listed so a picker can show them in their place, disabled, rather than drop them. None can be chosen: an import that asks for one is refused.","items":{"$ref":"#/components/schemas/UnavailableLeadEnrichmentSchema"},"title":"Unavailable Options","type":"array"}},"required":["options","unavailable_options","row_cost"],"title":"LeadEnrichmentOptionListResponseSchema","type":"object"},"LeadEnrichmentOptionSchema":{"description":"One enrichment offered at import, priced against the live catalog.","properties":{"already_covered":{"description":"Whether the search's own column plan already has a column named exactly this. Ticking the option regardless still adds a second column, suffixed to stay unique: the two are never merged.","title":"Already Covered","type":"boolean"},"column_display_name":{"description":"What the column this creates will be called.","title":"Column Display Name","type":"string"},"credits_for_rows":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"What the requested row count usually costs (credits_per_row times the rows); null if none was given.","title":"Credits For Rows"},"credits_per_row":{"description":"What a row that gets an answer usually costs: each row is charged the price of the source that answered it, read from which sources usually answer. Equal to max_credits_per_row when every source has one price. A row nobody can answer for is free.","title":"Credits Per Row","type":"number"},"description":{"title":"Description","type":"string"},"display_name":{"title":"Display Name","type":"string"},"key":{"$ref":"#/components/schemas/LeadEnrichmentOption"},"max_credits_per_row":{"description":"The most one row could cost (the dearest source), what the credit hold reserves. Quote it beside credits_per_row: up to this, usually about that.","title":"Max Credits Per Row","type":"number"}},"required":["key","display_name","description","column_display_name","already_covered","credits_per_row","max_credits_per_row"],"title":"LeadEnrichmentOptionSchema","type":"object"},"LeadPreviewResponseSchema":{"description":"A taste of the table a search would build, plus the size of the whole set.\n\nThe rows carry only the revealed columns. Everything else about a lead,\nemail included, stays on the server until the search becomes a table.","properties":{"already_in_tables":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How many of the sample `rows` are people another of your tables already holds. A people search leaves them out unless `include_people_already_in_tables` is set, so this says what that choice decides before anything is added. Null for every other search.","title":"Already In Tables"},"columns":{"description":"The columns a table built from these sample leads would show, in order, with `revealed` saying which ones the rows below carry. Decided the way the import decides them: a column no sample lead fills is left out, and a person's name stands as one `Name` column only when both halves were found, otherwise under the half's own label. Draw the header from this and leave the unrevealed cells empty. A search that adds more leads than the sample can fill a column the sample left out.","items":{"$ref":"#/components/schemas/LeadColumnSchema"},"title":"Columns","type":"array"},"earlier_table":{"anyOf":[{"$ref":"#/components/schemas/EarlierLeadTableSchema"},{"type":"null"}],"description":"A table this same search (the same filters) already built, when it still exists, so a second copy is not made by mistake."},"provider_notices":{"description":"What the data source said about the answer, in its own words. The signals data source narrows the scanned window to the most recent 14 days whenever an industry, size, revenue or job filter is set, and says so here rather than in the rows. Empty for every other search.","items":{"type":"string"},"title":"Provider Notices","type":"array"},"rows":{"description":"At most five sample leads, each a map from a revealed column's label to its value as text, blank where the lead has none. For a people search that is the person's name, job title and company; for a company search, the company's name. No other value is sent, and email is never among them: finding it is what an enrichment does once the search is a table.","items":{"additionalProperties":{"type":"string"},"type":"object"},"title":"Rows","type":"array"},"total":{"title":"Total","type":"integer"}},"required":["total","columns","rows"],"title":"LeadPreviewResponseSchema","type":"object"},"LeadRecordType":{"description":"Which dataset a search runs against, and so which provider serves it.\n\nValues are persisted in String(16) columns, so every member must stay\nwithin 16 characters.","enum":["people","companies","signal_companies","signal_people","lookalikes","local_businesses","hiring_companies","backlinks","search_results","post_authors"],"title":"LeadRecordType","type":"string"},"LeadRowCostSchema":{"description":"What the ROWS of a search cost, beside what the enrichments on them cost.\n\nIts own object rather than two more fields on the listing: the enrichment\noptions already carry ``credits_per_row``, and a second field of that name\none level up would be read as a third enrichment price. Nested, the total\nthe screen shows is unambiguous: this plus the ticked options, each\ncounted once.","properties":{"credits_for_rows":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"`credits_per_row` for the requested row count; null if none was given. The rows a run adds are what gets charged, so a run that matches fewer rows than asked for costs less than this.","title":"Credits For Rows"},"credits_per_request":{"default":0,"title":"Credits Per Request","type":"number"},"credits_per_row":{"description":"What one row of this search type costs, before any enrichment. Zero for the search types whose rows are free. Never included in an option's `credits_per_row`, so a true total is this plus the ticked options rather than either alone.","title":"Credits Per Row","type":"number"},"rows_per_request":{"default":1000,"title":"Rows Per Request","type":"integer"}},"required":["credits_per_row"],"title":"LeadRowCostSchema","type":"object"},"LeadSearchCadence":{"description":"How often a table's search runs on its own: on a calendar step, or every few days.","enum":["daily","weekly","monthly","quarterly","custom"],"title":"LeadSearchCadence","type":"string"},"LeadSearchHistoryEntrySchema":{"description":"One automatically recorded search run.","properties":{"id":{"format":"uuid","title":"Id","type":"string"},"query":{"additionalProperties":true,"title":"Query","type":"object"},"ran_at":{"format":"date-time","title":"Ran At","type":"string"},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"rows_created":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Rows an import added; null when the search was only browsed.","title":"Rows Created"},"table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The table an import added rows to, when one did.","title":"Table Id"},"total_matched":{"title":"Total Matched","type":"integer"},"user_id":{"title":"User Id","type":"string"}},"required":["id","user_id","record_type","query","total_matched","rows_created","table_id","ran_at"],"title":"LeadSearchHistoryEntrySchema","type":"object"},"LeadSearchHistoryListResponseSchema":{"description":"The workspace's recorded searches, newest activity first.","properties":{"entries":{"items":{"$ref":"#/components/schemas/LeadSearchHistoryEntrySchema"},"title":"Entries","type":"array"}},"required":["entries"],"title":"LeadSearchHistoryListResponseSchema","type":"object"},"LeadSearchRequestSchema":{"description":"A search request.\n\nEvery query shape is accepted on every request and the record type picks\nwhich one is read, so the client can keep a draft of each while the user\nmoves between the search types without losing what they typed.\n\nEach field is named exactly for the record type that reads it. A stored\nsearch is re-run by rebuilding the request as\n``{\"record_type\": rt, rt: query}``, which only holds while that stays true.","properties":{"backlinks":{"anyOf":[{"$ref":"#/components/schemas/BacklinksQuerySchema"},{"type":"null"}]},"companies":{"anyOf":[{"$ref":"#/components/schemas/CompanyQuerySchema"},{"type":"null"}]},"hiring_companies":{"anyOf":[{"$ref":"#/components/schemas/HiringCompaniesQuerySchema"},{"type":"null"}]},"local_businesses":{"anyOf":[{"$ref":"#/components/schemas/LocalBusinessQuerySchema"},{"type":"null"}]},"lookalikes":{"anyOf":[{"$ref":"#/components/schemas/LookalikeQuerySchema"},{"type":"null"}]},"people":{"anyOf":[{"$ref":"#/components/schemas/PeopleQuerySchema"},{"type":"null"}]},"post_authors":{"anyOf":[{"$ref":"#/components/schemas/PostAuthorsQuerySchema"},{"type":"null"}]},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"search_results":{"anyOf":[{"$ref":"#/components/schemas/SearchResultsQuerySchema"},{"type":"null"}]},"signal_companies":{"anyOf":[{"$ref":"#/components/schemas/SignalCompaniesQuerySchema"},{"type":"null"}]},"signal_people":{"anyOf":[{"$ref":"#/components/schemas/SignalPeopleQuerySchema"},{"type":"null"}]}},"required":["record_type"],"title":"LeadSearchRequestSchema","type":"object"},"LeadSearchRunLogListResponseSchema":{"description":"A table's recorded search runs, newest first.","properties":{"runs":{"description":"Every recorded run of the table's search, newest first. Empty when the table has no search.","items":{"$ref":"#/components/schemas/LeadSearchRunLogSchema"},"title":"Runs","type":"array"}},"required":["runs"],"title":"LeadSearchRunLogListResponseSchema","type":"object"},"LeadSearchRunLogSchema":{"description":"One recorded execution of a table's search.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"id":{"format":"uuid","title":"Id","type":"string"},"provider_notices":{"description":"What the data source said about the rows this run added, in the words to show beside them, gathered from every batch and each said once. A buying-signal search narrowed to its last 14 days says so here, and so does a hiring search that stopped at its limit of job postings. Empty for a run nothing qualified.","items":{"type":"string"},"title":"Provider Notices","type":"array"},"rows_created":{"description":"Rows this run has added to the table so far.","title":"Rows Created","type":"integer"},"rows_fetched":{"default":0,"description":"Rows the data source has handed over so far, whether new to the table or already in it. Reaches `rows_wanted` when the run is done.","title":"Rows Fetched","type":"integer"},"rows_not_added":{"anyOf":[{"$ref":"#/components/schemas/RowsNotAddedSchema"},{"type":"null"}],"description":"The people the search found that are not rows, and why, once every row is in: `found_twice` when the people search holds one person under two records, so a new table took them once; `already_in_table` when a person found was already a row of the table. Null when every person found was added, or while rows are still being added."},"rows_wanted":{"default":0,"description":"Rows the run set out to add in all; the denominator for a progress bar.","title":"Rows Wanted","type":"integer"},"status":{"$ref":"#/components/schemas/LeadSearchRunStatus","description":"`running` while a background import is still adding rows to the table, then `success` or `failed`."},"total_matched":{"title":"Total Matched","type":"integer"},"trigger":{"$ref":"#/components/schemas/LeadSearchRunTrigger"},"updated_at":{"description":"When the run last made progress.","format":"date-time","title":"Updated At","type":"string"}},"required":["id","status","trigger","rows_created","total_matched","error","created_at","updated_at"],"title":"LeadSearchRunLogSchema","type":"object"},"LeadSearchRunResponseSchema":{"description":"What one re-run of a table's search changed.","properties":{"import_status":{"$ref":"#/components/schemas/LeadSearchRunStatus","default":"success","description":"`running` when the request added a first batch and the rest is still being added in the background, so poll the table's search runs for progress; `success` when every row is in."},"people_skipped":{"default":0,"description":"People the request left out because another of the workspace's tables already has them. A run that continues in the background goes on skipping them.","title":"People Skipped","type":"integer"},"provider_notices":{"description":"What the data source said about the rows the request added, in the words to show beside them; see the create response. A run that continues in the background can add more, and the table's search runs carry every one.","items":{"type":"string"},"title":"Provider Notices","type":"array"},"rows_created":{"description":"Rows the request itself added.","title":"Rows Created","type":"integer"},"rows_not_added":{"anyOf":[{"$ref":"#/components/schemas/RowsNotAddedSchema"},{"type":"null"}],"description":"The people the search found that are not rows, and why, once every row is in: `found_twice` when the people search holds one person under two records, so a new table took them once; `already_in_table` when a person found was already a row of the table. Null when every person found was added, or while rows are still being added."},"rows_wanted":{"default":0,"description":"Rows the import set out to add in all.","title":"Rows Wanted","type":"integer"},"run_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The run row recording this import, when the search is persisted.","title":"Run Id"},"skip_limit_reached":{"default":false,"description":"Whether the search stopped looking after skipping as many people as one search may, so fewer rows may be added than asked for.","title":"Skip Limit Reached","type":"boolean"},"total_matched":{"title":"Total Matched","type":"integer"}},"required":["rows_created","total_matched"],"title":"LeadSearchRunResponseSchema","type":"object"},"LeadSearchRunStatus":{"description":"Where one run of a table's search stands.\n\n``running`` while rows are still being added, then ``success`` or ``failed``.","enum":["running","success","failed"],"title":"LeadSearchRunStatus","type":"string"},"LeadSearchRunTrigger":{"description":"What started a run of a table's search.","enum":["create","attach","manual","schedule"],"title":"LeadSearchRunTrigger","type":"string"},"LeadSearchScheduleRequestSchema":{"description":"A search's run cadence; a null cadence returns it to manual runs.","properties":{"at_minutes":{"anyOf":[{"maximum":1439.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"At Minutes"},"cadence":{"anyOf":[{"$ref":"#/components/schemas/LeadSearchCadence"},{"type":"null"}]},"every_days":{"anyOf":[{"maximum":365.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"title":"Every Days"},"starts_on":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"description":"The first day the schedule may run, as YYYY-MM-DD in `timezone`. Nothing runs before it, and next_runs count from it. Null, or a day already past, starts at once.","title":"Starts On"},"timezone":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"title":"Timezone"}},"title":"LeadSearchScheduleRequestSchema","type":"object"},"LeadSearchScheduleResponseSchema":{"description":"The scheduled search, plus its next few firings for preview.","properties":{"next_runs":{"items":{"format":"date-time","type":"string"},"title":"Next Runs","type":"array"},"source":{"$ref":"#/components/schemas/LeadSearchSourceResponseSchema"}},"required":["source","next_runs"],"title":"LeadSearchScheduleResponseSchema","type":"object"},"LeadSearchSourceResponseSchema":{"description":"The persisted search behind a table, in the request's own shape.","properties":{"next_run_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Next Run At"},"query":{"additionalProperties":true,"title":"Query","type":"object"},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Limit"},"schedule_at_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schedule At Minutes"},"schedule_cadence":{"anyOf":[{"$ref":"#/components/schemas/LeadSearchCadence"},{"type":"null"}]},"schedule_every_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schedule Every Days"},"schedule_starts_on":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"description":"The first day the schedule may run, in its own timezone; null when it started at once.","title":"Schedule Starts On"},"schedule_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Timezone"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["table_id","record_type","query","row_limit","schedule_cadence","schedule_every_days","schedule_at_minutes","schedule_timezone","next_run_at","updated_at"],"title":"LeadSearchSourceResponseSchema","type":"object"},"LeadSearchSuggestionListResponseSchema":{"description":"Starter searches worth clicking before any filters exist.","properties":{"suggestions":{"items":{"$ref":"#/components/schemas/LeadSearchSuggestionSchema"},"title":"Suggestions","type":"array"},"tailored":{"description":"True when the suggestions were written from the workspace's business context. False for the standard starters every workspace gets while its business context is empty, or when nothing tailored could be written from it.","title":"Tailored","type":"boolean"}},"required":["suggestions","tailored"],"title":"LeadSearchSuggestionListResponseSchema","type":"object"},"LeadSearchSuggestionSchema":{"description":"One clickable starter search, filters in the request's own shape.","properties":{"label":{"title":"Label","type":"string"},"query":{"additionalProperties":true,"title":"Query","type":"object"},"record_type":{"$ref":"#/components/schemas/LeadRecordType"}},"required":["label","record_type","query"],"title":"LeadSearchSuggestionSchema","type":"object"},"LeadSignalTypeGroupSchema":{"description":"One heading in the signal picker, and the signals filed under it.","properties":{"group":{"title":"Group","type":"string"},"types":{"items":{"$ref":"#/components/schemas/LeadSignalTypeSchema"},"title":"Types","type":"array"}},"required":["group","types"],"title":"LeadSignalTypeGroupSchema","type":"object"},"LeadSignalTypeListResponseSchema":{"description":"Every buying signal a search can look for, grouped for the picker.","properties":{"groups":{"items":{"$ref":"#/components/schemas/LeadSignalTypeGroupSchema"},"title":"Groups","type":"array"}},"required":["groups"],"title":"LeadSignalTypeListResponseSchema","type":"object"},"LeadSignalTypeSchema":{"description":"One buying signal a signals search can look for.","properties":{"association":{"description":"Whether the signal attaches to a company or to a person.","title":"Association","type":"string"},"content_filterable":{"description":"Whether this signal carries text, and so whether the `content_*` filters narrow anything when it is chosen.","title":"Content Filterable","type":"boolean"},"key":{"description":"What to send back in `signal_types`.","title":"Key","type":"string"},"label":{"description":"What to call it on screen.","title":"Label","type":"string"},"subtypes":{"description":"Narrower kinds within this signal, for the ones that have any.","items":{"type":"string"},"title":"Subtypes","type":"array"}},"required":["key","label","association","content_filterable"],"title":"LeadSignalTypeSchema","type":"object"},"LeadTableNameRequestSchema":{"description":"A search to name a table after, with the builder's picks and the viewer's zone.\n\nThe builder offers seniority, job function and region as picks, and a\nsearch sends each one as what it stands for: job titles, or a region's\ncountries. The first of those names a search badly (\"Founder\" for a\nC-suite search, \"United States\" for North America), so the picks travel\nhere by name instead, and the name reads them.","properties":{"backlinks":{"anyOf":[{"$ref":"#/components/schemas/BacklinksQuerySchema"},{"type":"null"}]},"companies":{"anyOf":[{"$ref":"#/components/schemas/CompanyQuerySchema"},{"type":"null"}]},"hiring_companies":{"anyOf":[{"$ref":"#/components/schemas/HiringCompaniesQuerySchema"},{"type":"null"}]},"job_functions":{"description":"The job functions a people search was built from ('Sales', 'Engineering'), on the same terms as `seniority`.","items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":200,"title":"Job Functions","type":"array"},"local_businesses":{"anyOf":[{"$ref":"#/components/schemas/LocalBusinessQuerySchema"},{"type":"null"}]},"lookalikes":{"anyOf":[{"$ref":"#/components/schemas/LookalikeQuerySchema"},{"type":"null"}]},"people":{"anyOf":[{"$ref":"#/components/schemas/PeopleQuerySchema"},{"type":"null"}]},"post_authors":{"anyOf":[{"$ref":"#/components/schemas/PostAuthorsQuerySchema"},{"type":"null"}]},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"regions":{"description":"The regions a people or company search's places were picked as, as the builder names them ('NAM (North America)'). The first names the place in place of the countries it stands for. Ignored on every other search.","items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":200,"title":"Regions","type":"array"},"search_results":{"anyOf":[{"$ref":"#/components/schemas/SearchResultsQuerySchema"},{"type":"null"}]},"seniority":{"description":"The seniority levels a people search was built from, as the builder names them ('C-suite', 'VP'). Leave the job titles they stand for out of `people.job_title`, or the first of those titles names the table too. Ignored on every other search.","items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":200,"title":"Seniority","type":"array"},"signal_companies":{"anyOf":[{"$ref":"#/components/schemas/SignalCompaniesQuerySchema"},{"type":"null"}]},"signal_people":{"anyOf":[{"$ref":"#/components/schemas/SignalPeopleQuerySchema"},{"type":"null"}]},"timezone":{"default":"UTC","description":"The viewer's IANA time zone, such as Europe/Berlin. A search named by nothing else is dated with today's date there.","maxLength":64,"minLength":1,"title":"Timezone","type":"string"}},"required":["record_type"],"title":"LeadTableNameRequestSchema","type":"object"},"LeadValueMatchSchema":{"description":"One value's outcome against the vocabulary it was checked against.","properties":{"exact_match":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The vocabulary's own spelling, when the value was already in it once case and surrounding space are folded away.","title":"Exact Match"},"suggested_match":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The vocabulary entry this value most likely means, when it was not an exact match and something close enough exists.","title":"Suggested Match"},"value":{"description":"The value as it was sent.","title":"Value","type":"string"}},"required":["value"],"title":"LeadValueMatchSchema","type":"object"},"LeadVocabularyField":{"description":"One of the search fields whose values a closed vocabulary decides.\n\nValues are the same names the request schemas already give these fields\n(``PeopleQuerySchema.departments``, and ``FieldSpec.apiFilter`` on the\nfrontend, which pins a provider complaint to the box the person typed\nin), so matching a value for a field names it exactly as every other\nsurface already does.\n\n``PeopleQuerySchema.company_type`` (a person's current/past employer's\ntype) and ``CompanyQuerySchema.company_type`` (the Companies search's own\nfield) both name themselves ``company_type`` AND share one member here:\nthe People search's employer type is the same eight values as the\nCompanies search's own type (``CLEAN_COMPANY_TYPES``; see its own\ncomment), confirmed independently on both indexes, so one entry serves\nboth schemas' ``company_type``/``past_company_type`` fields.","enum":["departments","past_departments","management_levels","past_management_levels","company_size_bands","department","company_industry","past_company_industry","industry","company_type","past_company_type"],"title":"LeadVocabularyField","type":"string"},"LikeLatestPostOutcome":{"additionalProperties":false,"description":"What liking the latest post produced: the common fields and the nine profile facts.\n\nA member with no posts is skipped, not failed.","properties":{"already_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Connected"},"already_following":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Following"},"can_send_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Send Message"},"found_already":{"anyOf":[{"$ref":"#/components/schemas/LinkedInFoundAlready"},{"type":"null"}]},"invitation_pending":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invitation Pending"},"kind":{"const":"like_latest_post","default":"like_latest_post","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"member_urns":{"items":{"maxLength":128,"type":"string"},"maxItems":8,"title":"Member Urns","type":"array"},"open_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Open Profile"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"profile_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Profile Resolved"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"vanity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity"}},"title":"LikeLatestPostOutcome","type":"object"},"LikeLatestPostParams":{"additionalProperties":false,"description":"Like whatever the member posted most recently, if anything. Starts at ``profile_url``.","properties":{"kind":{"const":"like_latest_post","default":"like_latest_post","title":"Kind","type":"string"},"profile_url":{"maxLength":512,"title":"Profile Url","type":"string"}},"required":["profile_url"],"title":"LikeLatestPostParams","type":"object"},"LinkedInAccountReadSchema":{"properties":{"approvals_waiting":{"default":0,"description":"How many of this sender's LinkedIn steps wait for a person on Tasks, less those a paused sequence or paused contact holds.","title":"Approvals Waiting","type":"integer"},"checkpoint_status":{"$ref":"#/components/schemas/LinkedInCheckpointStatus"},"connection_checks":{"anyOf":[{"$ref":"#/components/schemas/LinkedInConnectionChecksReadSchema"},{"type":"null"}],"description":"How the readings of the sender's newest connections, which notice accepted connection requests, are doing. Older servers leave it out."},"connection_token":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What a person pastes into the extension to connect a browser. Several browsers may use it; Regenerate and Disconnect replace it.","title":"Connection Token"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"daily_limit_check_connections":{"description":"Readings of the sender's newest connections a day: how accepted connection requests are noticed. Zero stops them.","title":"Daily Limit Check Connections","type":"integer"},"daily_limit_check_inbox":{"title":"Daily Limit Check Inbox","type":"integer"},"daily_limit_check_sent_invitations":{"title":"Daily Limit Check Sent Invitations","type":"integer"},"daily_limit_connection_request":{"title":"Daily Limit Connection Request","type":"integer"},"daily_limit_follow":{"title":"Daily Limit Follow","type":"integer"},"daily_limit_like_post":{"title":"Daily Limit Like Post","type":"integer"},"daily_limit_profile_view":{"title":"Daily Limit Profile View","type":"integer"},"daily_limit_read_conversation":{"title":"Daily Limit Read Conversation","type":"integer"},"daily_limit_send_message":{"description":"Messages and InMails a day, counted together.","title":"Daily Limit Send Message","type":"integer"},"daily_limit_withdraw":{"title":"Daily Limit Withdraw","type":"integer"},"display_name":{"title":"Display Name","type":"string"},"effective_run_mode":{"$ref":"#/components/schemas/LinkedInApprovalMode","description":"The approval setting in force for this sender's LinkedIn steps: their own, else manual. What the extension's side panel shows."},"headline":{"title":"Headline","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"last_seen_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Seen At"},"limit_maximums":{"$ref":"#/components/schemas/LinkedInLimitMaximumsReadSchema","description":"The most each limit above may be set to, under the same field names the settings update takes. A value above one is refused with a 422."},"member_urn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Urn"},"min_action_interval_seconds":{"description":"The least time between two steps on this LinkedIn account, in seconds, before a random widening of up to 40% is added. It holds across every sequence the account sends for.","title":"Min Action Interval Seconds","type":"integer"},"online":{"title":"Online","type":"boolean"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"presence":{"$ref":"#/components/schemas/LinkedInPresence","description":"active: a browser checked in within the last couple of minutes. idle: seen within the last day. not_seen: no browser has checked in for a day."},"queued_count":{"default":0,"title":"Queued Count","type":"integer"},"replies_check":{"anyOf":[{"$ref":"#/components/schemas/LinkedInRepliesCheckReadSchema"},{"type":"null"}],"description":"Whether the sender's inbox is being read for the messages that wait on it. Older servers leave it out."},"run_mode":{"anyOf":[{"$ref":"#/components/schemas/LinkedInApprovalMode"},{"type":"null"}],"description":"The sender's own LinkedIn approval setting: manual (a person approves each step on Tasks before it is queued) or auto (steps are queued without asking). Null when it was never set, which runs as manual."},"sender_profile_id":{"format":"uuid","title":"Sender Profile Id","type":"string"},"sessions":{"description":"Every browser currently connected, most recent first.","items":{"$ref":"#/components/schemas/LinkedInAgentSessionReadSchema"},"title":"Sessions","type":"array"},"status":{"$ref":"#/components/schemas/LinkedInAccountStatus"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"usage":{"default":[],"items":{"$ref":"#/components/schemas/LinkedInKindUsageReadSchema"},"title":"Usage","type":"array"},"usage_resets_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When today's counts in usage start over: 00:00 in the sender's timezone. Older servers leave it out, and a client then reads the next UTC midnight.","title":"Usage Resets At"},"vanity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity Name"},"wait":{"anyOf":[{"$ref":"#/components/schemas/LinkedInWaitReadSchema"},{"type":"null"}],"description":"What the next step is waiting on, and until when; null while nothing is queued."},"weekly_connection_request_cap":{"title":"Weekly Connection Request Cap","type":"integer"},"weekly_limit_check_connections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Check Connections"},"weekly_limit_check_inbox":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Check Inbox"},"weekly_limit_check_sent_invitations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Check Sent Invitations"},"weekly_limit_follow":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Follow"},"weekly_limit_like_post":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Like Post"},"weekly_limit_profile_view":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Profile View"},"weekly_limit_read_conversation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Read Conversation"},"weekly_limit_send_message":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Send Message"},"weekly_limit_withdraw":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit Withdraw"}},"required":["id","sender_profile_id","status","checkpoint_status","member_urn","vanity_name","display_name","headline","photo_url","run_mode","effective_run_mode","online","presence","last_seen_at","daily_limit_profile_view","daily_limit_connection_request","daily_limit_send_message","daily_limit_withdraw","daily_limit_follow","daily_limit_like_post","daily_limit_check_sent_invitations","daily_limit_check_inbox","daily_limit_read_conversation","daily_limit_check_connections","weekly_connection_request_cap","min_action_interval_seconds","limit_maximums","created_at","updated_at"],"title":"LinkedInAccountReadSchema","type":"object"},"LinkedInAccountStateSchema":{"description":"The sender's LinkedIn state, connected or not.\n\nA wrapper rather than a 404 on purpose: \"no account yet\" is the normal first\nrender of this page, not an error. The connection token is present in BOTH\nstates: shown by default before anything is connected, and available again\nafterwards for a second browser.","properties":{"account":{"anyOf":[{"$ref":"#/components/schemas/LinkedInAccountReadSchema"},{"type":"null"}]},"connected":{"title":"Connected","type":"boolean"},"connection_token":{"description":"Paste this into the Oneprofile extension to connect a browser as this sender.","title":"Connection Token","type":"string"}},"required":["connected","account","connection_token"],"title":"LinkedInAccountStateSchema","type":"object"},"LinkedInAccountStatus":{"description":"Pairing lifecycle.\n\n``PENDING`` exists between \"the user asked to connect\" and \"an extension\nactually bound a LinkedIn member to it\", so the sender page can show a\nhalf-finished connection rather than nothing at all.","enum":["pending","active","revoked"],"title":"LinkedInAccountStatus","type":"string"},"LinkedInActionKind":{"description":"What the browser agent is being asked to do.\n\nThe four ``CHECK_*``/``READ_*`` kinds are housekeeping: they read our own\noutbound invitations, our own newest connections and our own conversations to\ndetect what the contact did, so they are free and deliberately excluded from\nthe priced kinds below.\n\n``CHECK_CONNECTIONS`` reads the first batch of the sender's connections list,\nnewest first: a person found there has accepted, whenever the invitation\nwent out. It is how an acceptance is noticed at all once an invitation has\nfallen out of the ten rows the sent list shows a background tab.\n\n``CHECK_INBOX`` scans the conversation list for threads with new inbound\nactivity; ``READ_CONVERSATION`` opens one of them and reads it in full. The\nsplit keeps LinkedIn activity proportional to real replies: the cheap scan\nruns on every sweep, the expensive read only where the scan saw a change.\n\n``LIKE_LATEST_POST`` targets the contact's most recent post at the moment\nthe browser runs it. A contact with no posts is not a failure: the driver\nreports the action ``SKIPPED``, and the sequence advances either way.\n\nEvery profile-targeted outcome carries the facts the browser read off the\nprofile, including the three-state Premium \"Open Profile\" reading; see the\nsection comment above the outcome models.","enum":["profile_view","connection_request","send_message","inmail","withdraw_connection_request","follow_contact","like_latest_post","check_sent_invitations","check_connections","check_inbox","read_conversation"],"title":"LinkedInActionKind","type":"string"},"LinkedInActionOutcome-Input":{"description":"What one action reported back. Consumers read the member via ``.root``.\n\nNull on the row while the action is queued or claimed, and on a row the\nbackend settled unrun by rejection or cancellation; a document of the\nmatching member once a browser ran it or expiry settled it.","discriminator":{"mapping":{"check_connections":"#/components/schemas/CheckConnectionsOutcome","check_inbox":"#/components/schemas/CheckInboxOutcome","check_sent_invitations":"#/components/schemas/CheckSentInvitationsOutcome","connection_request":"#/components/schemas/ConnectionRequestOutcome","follow_contact":"#/components/schemas/FollowContactOutcome","inmail":"#/components/schemas/InMailOutcome","like_latest_post":"#/components/schemas/LikeLatestPostOutcome","profile_view":"#/components/schemas/ProfileViewOutcome","read_conversation":"#/components/schemas/ReadConversationOutcome","send_message":"#/components/schemas/SendMessageOutcome","withdraw_connection_request":"#/components/schemas/WithdrawConnectionRequestOutcome"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/ProfileViewOutcome"},{"$ref":"#/components/schemas/ConnectionRequestOutcome"},{"$ref":"#/components/schemas/SendMessageOutcome"},{"$ref":"#/components/schemas/InMailOutcome"},{"$ref":"#/components/schemas/WithdrawConnectionRequestOutcome"},{"$ref":"#/components/schemas/FollowContactOutcome"},{"$ref":"#/components/schemas/LikeLatestPostOutcome"},{"$ref":"#/components/schemas/CheckSentInvitationsOutcome"},{"$ref":"#/components/schemas/CheckConnectionsOutcome"},{"$ref":"#/components/schemas/CheckInboxOutcome"},{"$ref":"#/components/schemas/ReadConversationOutcome"}],"title":"LinkedInActionOutcome"},"LinkedInActionOutcome-Output":{"description":"What one action reported back. Consumers read the member via ``.root``.\n\nNull on the row while the action is queued or claimed, and on a row the\nbackend settled unrun by rejection or cancellation; a document of the\nmatching member once a browser ran it or expiry settled it.","discriminator":{"mapping":{"check_connections":"#/components/schemas/CheckConnectionsOutcome","check_inbox":"#/components/schemas/CheckInboxOutcome","check_sent_invitations":"#/components/schemas/CheckSentInvitationsOutcome","connection_request":"#/components/schemas/ConnectionRequestOutcome","follow_contact":"#/components/schemas/FollowContactOutcome","inmail":"#/components/schemas/InMailOutcome","like_latest_post":"#/components/schemas/LikeLatestPostOutcome","profile_view":"#/components/schemas/ProfileViewOutcome","read_conversation":"#/components/schemas/ReadConversationOutcome","send_message":"#/components/schemas/SendMessageOutcome","withdraw_connection_request":"#/components/schemas/WithdrawConnectionRequestOutcome"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/ProfileViewOutcome"},{"$ref":"#/components/schemas/ConnectionRequestOutcome"},{"$ref":"#/components/schemas/SendMessageOutcome"},{"$ref":"#/components/schemas/InMailOutcome"},{"$ref":"#/components/schemas/WithdrawConnectionRequestOutcome"},{"$ref":"#/components/schemas/FollowContactOutcome"},{"$ref":"#/components/schemas/LikeLatestPostOutcome"},{"$ref":"#/components/schemas/CheckSentInvitationsOutcome"},{"$ref":"#/components/schemas/CheckConnectionsOutcome"},{"$ref":"#/components/schemas/CheckInboxOutcome"},{"$ref":"#/components/schemas/ReadConversationOutcome"}],"title":"LinkedInActionOutcome"},"LinkedInActionParams":{"description":"What one action is asked to do. Consumers read the member via ``.root``.","discriminator":{"mapping":{"check_connections":"#/components/schemas/CheckConnectionsParams","check_inbox":"#/components/schemas/CheckInboxParams","check_sent_invitations":"#/components/schemas/CheckSentInvitationsParams","connection_request":"#/components/schemas/ConnectionRequestParams","follow_contact":"#/components/schemas/FollowContactParams","inmail":"#/components/schemas/InMailParams","like_latest_post":"#/components/schemas/LikeLatestPostParams","profile_view":"#/components/schemas/ProfileViewParams","read_conversation":"#/components/schemas/ReadConversationParams","send_message":"#/components/schemas/SendMessageParams","withdraw_connection_request":"#/components/schemas/WithdrawConnectionRequestParams"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/ProfileViewParams"},{"$ref":"#/components/schemas/ConnectionRequestParams"},{"$ref":"#/components/schemas/SendMessageParams"},{"$ref":"#/components/schemas/InMailParams"},{"$ref":"#/components/schemas/WithdrawConnectionRequestParams"},{"$ref":"#/components/schemas/FollowContactParams"},{"$ref":"#/components/schemas/LikeLatestPostParams"},{"$ref":"#/components/schemas/CheckSentInvitationsParams"},{"$ref":"#/components/schemas/CheckConnectionsParams"},{"$ref":"#/components/schemas/CheckInboxParams"},{"$ref":"#/components/schemas/ReadConversationParams"}],"title":"LinkedInActionParams"},"LinkedInActionReadSchema":{"description":"One LinkedIn step, in the shape the dashboard and every extension build read.\n\nA step is queued only once it may run (its approval, when one was asked\nfor, happened on Tasks before it was queued), so every step reads\n``approved_at`` as the moment it was queued and ``requires_approval``\nfalse: the extension's store builds draw \"Approve tasks\" from exactly\nthese two fields, and no step in the line waits for a person. ``hold`` is\nkept for the same builds and is always null: whether a step is out of the\nline is ``held``.","properties":{"account_id":{"format":"uuid","title":"Account Id","type":"string"},"acted_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the step said it acted on LinkedIn, for a result that arrived late. On a failed step it means the step happened after all: it stays failed for a person, and a Retry checks LinkedIn first and never sends it twice.","title":"Acted At"},"approved_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the step was let run: the moment it was queued, since a step is queued only once it may run. Kept for older extension builds.","title":"Approved At"},"claimed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Claimed At"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"error_code":{"anyOf":[{"$ref":"#/components/schemas/LinkedInAgentErrorCode"},{"type":"null"}]},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"finished_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished At"},"held":{"default":false,"description":"Whether the step is held out of every browser's line, because its paused sequence or paused contact holds it. It runs once they are resumed. Only the dashboard's queue lists a held step that is waiting; a browser is never sent one.","title":"Held","type":"boolean"},"hold":{"anyOf":[{"$ref":"#/components/schemas/StepHold"},{"type":"null"}],"description":"Always null; read `held`. Kept for older extension builds."},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"$ref":"#/components/schemas/LinkedInActionKind"},"metered":{"default":true,"description":"Whether the step spends the sender's limits and credit. False for a step the Oneprofile team fired to test the sender: it goes first, waits for no gap and counts against no limit.","title":"Metered","type":"boolean"},"outcome":{"anyOf":[{"$ref":"#/components/schemas/LinkedInActionOutcome-Output"},{"type":"null"}]},"params":{"$ref":"#/components/schemas/LinkedInActionParams"},"queued_at":{"format":"date-time","title":"Queued At","type":"string"},"requires_approval":{"default":false,"description":"Always false: a step that asks for a person waits on Oneprofile's Tasks page, never in the line. Kept for older extension builds.","title":"Requires Approval","type":"boolean"},"status":{"$ref":"#/components/schemas/LinkedInActionStatus"}},"required":["id","account_id","kind","params","status","outcome","error_code","error_message","queued_at","claimed_at","finished_at","duration_ms"],"title":"LinkedInActionReadSchema","type":"object"},"LinkedInActionStatus":{"description":"Where one queued action stands.\n\nGovernor-deferral is deliberately NOT a status: an action whose kind has hit\nits daily cap stays ``QUEUED`` and is simply not handed out, with the reason\ntravelling on the hand-out response instead. A ``DEFERRED`` row would make\nthe queue lie about what is still waiting to happen.\n\n``SKIPPED`` is \"not applicable\" (no LinkedIn URL, already connected);\n``REJECTED`` is \"a human refused it\"; ``FAILED`` is \"we tried and could not\".\n\n``RESUMING`` is a step put back in line after an attempt that may have\nacted on LinkedIn (its browser was granted the press, or lost track of the\nstep): it is never \"queued\", so no path that assumes nothing happened yet\n(moving it to another sender, a plain copy, \"did not run\") ever reads it as\nsuch, and it is handed only to a browser that checks LinkedIn before acting.","enum":["queued","resuming","claimed","succeeded","failed","rejected","skipped"],"title":"LinkedInActionStatus","type":"string"},"LinkedInAgentErrorCode":{"description":"Why one action did not succeed, as a closed vocabulary.\n\nTwo populations in one enum, on purpose. The first twelve are reported by\nthe browser agent and were previously a free string that only the extension\nhad written down, so nothing stopped a typo storing and rendering exactly like\na real code. The last four the backend writes itself: three when an action\nsettles without the browser ever running it, and ``CLAIM_EXPIRED`` when the\nbrowser took a step and then went silent, so nobody can say whether it ran.\n\nThe list is the whole contract: a code outside it is rejected at the API\nboundary rather than persisted, so the extension and the dashboard can only\never speak about failures both sides can name.","enum":["selector_missing","blocked_checkpoint","not_authenticated","account_mismatch","navigation_failed","timed_out","linkedin_error","agent_restarted","tab_lost","not_applicable","not_connected","invalid_params","user_rejected","cancelled","missed_window","sender_changed","claim_expired","interrupted_repeatedly"],"title":"LinkedInAgentErrorCode","type":"string"},"LinkedInAgentReportableStatus":{"description":"The subset of ``LinkedInActionStatus`` a browser agent is allowed to post.\n\n``QUEUED`` and ``CLAIMED`` are the server's to write, and ``REJECTED``\narrives on its own endpoint because it costs neither budget nor credit.\nPosting it as a result would settle the action down the wrong path. The\nresult endpoint accepted the full enum before this existed, so an agent\ncould post ``claimed`` and have it written with a ``finished_at``.","enum":["succeeded","failed","skipped"],"title":"LinkedInAgentReportableStatus","type":"string"},"LinkedInAgentSessionReadSchema":{"description":"One browser connected to the account: a laptop, a desktop, a teammate's machine.","properties":{"browser_label":{"title":"Browser Label","type":"string"},"connected_at":{"format":"date-time","title":"Connected At","type":"string"},"extension_version":{"title":"Extension Version","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"last_seen_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Seen At"},"presence":{"$ref":"#/components/schemas/LinkedInPresence"}},"required":["id","browser_label","extension_version","presence","last_seen_at","connected_at"],"title":"LinkedInAgentSessionReadSchema","type":"object"},"LinkedInApprovalMode":{"description":"Whether a person approves a sender's LinkedIn steps before they run, or they run on their own.\n\nThe sender's own LinkedIn setting, kept on the sender beside their email\nmodes so the approval queue reads one home for both. The absence of one\n(``SenderProfileDTO.linkedin_approval_mode`` is None) reads as MANUAL:\nnothing runs on somebody's LinkedIn unattended until they have said so. The\napproval queue still tells \"never set\" apart from \"chose manual\", which is\nthe level its settings surfaces name.","enum":["manual","auto"],"title":"LinkedInApprovalMode","type":"string"},"LinkedInApprovalScheduleReadSchema":{"description":"When one sender's share of the steps just approved is expected to run.","properties":{"account_id":{"format":"uuid","title":"Account Id","type":"string"},"after_reset":{"description":"How many wait for that reset or later.","title":"After Reset","type":"integer"},"before_reset":{"description":"How many are expected to start before the next daily reset (midnight in the sender's timezone).","title":"Before Reset","type":"integer"},"blocked":{"anyOf":[{"$ref":"#/components/schemas/LinkedInScheduleBlock"},{"type":"null"}],"description":"What stops them outright: `browser_offline` no browser is checked in for the sender, `account_blocked` the account is disconnected or at a checkpoint, `weekly_limit` the weekly invitation cap is spent, `kind_disabled` a limit is set to 0. `outside_window` is not a stop: some of them wait for their sequence's sending hours, in the sender's timezone, which open at `opens_at`. Null when nothing does."},"count":{"description":"How many of the approved steps are this sender's.","title":"Count","type":"integer"},"first_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the first of them starts; null when no time can be named.","title":"First At"},"held":{"default":0,"description":"How many of them wait for their paused sequence or paused contact to be resumed. They are in no line until then, and the counts and times above leave them out.","title":"Held","type":"integer"},"last_at_estimate":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the last of them is expected to start; null when it cannot be named.","title":"Last At Estimate"},"opens_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the sending hours the first of them waits for open; null when none wait for them.","title":"Opens At"},"outside_window":{"default":0,"description":"How many of them wait for their sequence's sending hours, shut now in the sender's timezone.","title":"Outside Window","type":"integer"},"resets_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The daily reset those wait for; null when none do.","title":"Resets At"},"sender_name":{"description":"The sender as the Senders page names them.","title":"Sender Name","type":"string"},"sender_profile_id":{"format":"uuid","title":"Sender Profile Id","type":"string"}},"required":["account_id","sender_profile_id","sender_name","count","first_at","last_at_estimate","before_reset","after_reset","resets_at","blocked"],"title":"LinkedInApprovalScheduleReadSchema","type":"object"},"LinkedInAttemptVerdict":{"description":"The server's answer to a browser that lost a run of a step and wants to start it again.\n\n``RETRY``: start it again. ``LOOK_FIRST``: start it again, looking on\nLinkedIn before pressing anything, because an earlier run was let press.\n``STOP``: the step was interrupted too often and the server settled it\nfailed. ``LOST``: the claim is no longer this browser's. ``NOT_RETRYABLE``:\nwhat stopped it is not an interruption, or a press LinkedIn never answered\nor a page that never drew reached the cap; post the result instead.","enum":["retry","look_first","stop","lost","not_retryable"],"title":"LinkedInAttemptVerdict","type":"string"},"LinkedInCheckpointStatus":{"description":"Whether LinkedIn is currently challenging this account.","enum":["ok","checkpoint"],"title":"LinkedInCheckpointStatus","type":"string"},"LinkedInCommitRefusal":{"description":"Why the server would not let a run press the control that changes LinkedIn.\n\n``lost``: the claim is no longer this browser's (settled, put back, or\nanother browser's). ``expired``: it has no lease (a lease that ran out on\na claim still this browser's is renewed by the grant). ``stale_run``: another\nrun of the same claim holds the grant. ``requeue_at_reset``: the step was\nheld into a new day whose limit is spent; it waits for the reset, put back\nto be looked at again, and never fails for it. ``wait_for_replies``: a\nmessage not pressed yet, while its sender's inbox goes unread or its\nrecipient's reply waits to be read; put back in line (2026-10-05).","enum":["lost","expired","stale_run","requeue_at_reset","wait_for_replies"],"title":"LinkedInCommitRefusal","type":"string"},"LinkedInConnectionChecksProblem":{"description":"The one problem with an account's connection checks a person can do something about.\n\nEach is named only while invitations are waiting for an answer.\n``EXTENSION_OUTDATED``: the browser driving the account runs a build that\ncannot read the connections list. ``CHECKS_FAILING``: readings keep failing,\nand ``last_checked_at`` names the last one that worked. ``TURNED_OFF``: the\nreadings' daily or weekly limit is set to zero. The first and the last are\nnamed only once the readings are announced (out of ``UNANNOUNCED_KINDS``):\nbefore an extension that runs them is released there is nothing to update\nto and no limit shown to raise. ``EXTENSION_OUTDATED`` also needs a browser\nconnected; with none, the account's sessions say why nothing runs.","enum":["extension_outdated","checks_failing","turned_off"],"title":"LinkedInConnectionChecksProblem","type":"string"},"LinkedInConnectionChecksReadSchema":{"description":"How the readings of the sender's newest connections are doing.\n\nThey are how an accepted connection request is noticed: a member found on\nthe list has accepted. The sender's tab shows only the problem states.","properties":{"awaiting":{"description":"Connection requests a sequence is still waiting to hear an answer to.","title":"Awaiting","type":"integer"},"gaps":{"description":"The last week's stretches nobody watched, oldest first.","items":{"$ref":"#/components/schemas/LinkedInConnectionsGapReadSchema"},"title":"Gaps","type":"array"},"last_checked_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a reading last worked; null when none has yet.","title":"Last Checked At"},"next_check_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the next reading is due; null when none will run (nothing awaited, the browser cannot run one, or its limit is zero).","title":"Next Check At"},"problem":{"anyOf":[{"$ref":"#/components/schemas/LinkedInConnectionChecksProblem"},{"type":"null"}],"description":"The one problem a person can act on, only while answers are awaited: extension_outdated (the browser's build cannot read the list), checks_failing (readings keep failing since last_checked_at), or turned_off (the readings' limit is zero). Null when nothing is wrong."},"supported":{"description":"Whether the browser driving the account runs a build that reads the list.","title":"Supported","type":"boolean"},"watched_since":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Since when every acceptance on this account would have been seen; null when no reading has worked yet.","title":"Watched Since"}},"required":["supported","awaiting","last_checked_at","watched_since","next_check_at","problem","gaps"],"title":"LinkedInConnectionChecksReadSchema","type":"object"},"LinkedInConnectionRow":{"additionalProperties":false,"description":"One row of a connections reading, newest first, as keys only.\n\n``keys`` spell the member the row names: its vanity, and any URN that was\ncross-checked against it, each hashed (see ``CONNECTION_ROW_KEY_PATTERN``).\nA row that named nobody the reading could trust has no keys, and keeps its\nplace, because where an unread row sits decides whether the reading proves\nthat nothing was missed.","properties":{"keys":{"items":{"pattern":"^[0-9a-f]{32}$","type":"string"},"maxItems":4,"title":"Keys","type":"array"}},"title":"LinkedInConnectionRow","type":"object"},"LinkedInConnectionsGapReadSchema":{"description":"A stretch the readings of the sender's newest connections could not watch.","properties":{"ended_at":{"description":"The reading that could not prove it missed nothing.","format":"date-time","title":"Ended At","type":"string"},"problem":{"anyOf":[{"$ref":"#/components/schemas/LinkedInConnectionsReadProblem"},{"type":"null"}],"description":"Why: no_overlap (nothing shared with the reading before), short_overlap (fewer than two rows shared in order), reordered (a row of the reading before sat above the first shared one), or unread_rows (more unreadable rows above the overlap than before). Null for a value this server does not know."},"started_at":{"description":"The last reading that worked before it.","format":"date-time","title":"Started At","type":"string"}},"required":["started_at","ended_at","problem"],"title":"LinkedInConnectionsGapReadSchema","type":"object"},"LinkedInConnectionsReadProblem":{"description":"Why a connections reading was a gap or unjudged, as a closed vocabulary.\n\nThe gaps: nothing shared with the last judged reading (``NO_OVERLAP``,\nLinkedIn's empty list after one that listed rows included), fewer than two\nrows shared in order (``SHORT_OVERLAP``), a row of the last reading above\nthe first shared one (``REORDERED``), or more rows nobody could read above\nthe overlap than the last reading had (``UNREAD_ROWS``). The unjudged: the\nread failed or was skipped (``READ_FAILED``), its keys were salted for a\nmember other than the account's (``MEMBER_MISMATCH``), the list was not\nread in full (``INCOMPLETE``), its \"Recently added\" sort was not proven\n(``SORT_UNPROVEN``), or two snapshots disagreed (``UNSTABLE``).\n\nMembers are only ever added; a stored value this build does not know reads\nas None rather than failing the read.","enum":["no_overlap","short_overlap","reordered","unread_rows","read_failed","member_mismatch","incomplete","sort_unproven","unstable"],"title":"LinkedInConnectionsReadProblem","type":"string"},"LinkedInConversationRow":{"additionalProperties":false,"description":"One row of the message-list scan, as the agent read it off the page.","properties":{"conversation_urn":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Conversation Urn"},"last_activity_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Activity At"},"last_inbound_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Inbound At"},"member_urn":{"maxLength":128,"title":"Member Urn","type":"string"},"snippet":{"default":"","maxLength":200,"title":"Snippet","type":"string"}},"required":["member_urn"],"title":"LinkedInConversationRow","type":"object"},"LinkedInDiagnosticTrigger":{"description":"Why a browser filed a page report, as a closed vocabulary.\n\nA report is filed where a driver decided something from what it could NOT\nfind, or found something it does not know, so the markup behind the\ndecision can be read later (by a person, a Claude session, or server-side\ninference) and the selectors improved:\n\n- ``CONTROL_MISSING``: a control or window the step needs was not found.\n- ``UNRECOGNIZED_SURFACE``: a window appeared that nothing explains.\n- ``UNCONFIRMED``: the step pressed its last button and could not verify\n  the result.\n- ``DRIVER_ERROR``: the driver threw.\n- ``NOT_OFFERED``: the step decided from an absence that LinkedIn does not\n  offer the control. Normal for most kinds (no posts to like, no Message\n  on a stranger), and the symptom of a selector that stopped matching when\n  it is not.\n- ``PAGE_UNSETTLED``: the page had not drawn its controls yet.\n- ``ACCOUNT_LIMIT``: LinkedIn is limiting this account, not us.\n- ``NO_RESPONSE``: a control was found and pressed, and nothing answered\n  it: no window, no menu, no change. Not ``CONTROL_MISSING``, which says\n  the control itself was not there; the two need different fixes.\n- ``STEP_FAILED``: the server filed the report itself, for a failed step\n  whose browser filed none of its own: a navigation that never landed, a\n  refusal toast, a lapsed claim, an identity check. Every failed step\n  gets a report, and this is the trigger when nothing more specific is\n  known.\n\nMembers are only ever added. A stored value this server does not know (a\nnewer build's, read after a rollback) reads as ``STEP_FAILED`` rather\nthan failing the read; see ``sql_repository._to_diagnostic_dto``.","enum":["control_missing","unrecognized_surface","unconfirmed","driver_error","not_offered","page_unsettled","account_limit","no_response","step_failed"],"title":"LinkedInDiagnosticTrigger","type":"string"},"LinkedInFoundAlready":{"description":"Why a step that changes LinkedIn found its change already there, and settled succeeded.\n\nOnly for a step whose own earlier attempt may have made it: the server had\ngranted that attempt the press. A change already there with no grant ever\nwas made outside Oneprofile, and settles skipped (\"already pending\" and so\non), uncharged.","enum":["earlier_attempt"],"title":"LinkedInFoundAlready","type":"string"},"LinkedInHistoryPageSchema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LinkedInActionReadSchema"},"title":"Items","type":"array"},"stats":{"$ref":"#/components/schemas/LinkedInStatsReadSchema"},"total":{"title":"Total","type":"integer"}},"required":["items","total","stats"],"title":"LinkedInHistoryPageSchema","type":"object"},"LinkedInKindUsageReadSchema":{"description":"One limit's spend, today and over the rolling week.\n\nOne entry per limit, so there is no ``inmail`` entry: InMails spend the\nmessage limit and are counted in the ``send_message`` entry.","properties":{"daily_limit":{"title":"Daily Limit","type":"integer"},"kind":{"$ref":"#/components/schemas/LinkedInActionKind"},"remaining_today":{"description":"What may still run today: the daily limit's headroom, held to the weekly limit's when that is nearer.","title":"Remaining Today","type":"integer"},"used_this_week":{"default":0,"description":"Spent over today and the six days before it.","title":"Used This Week","type":"integer"},"used_today":{"title":"Used Today","type":"integer"},"weekly_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The ceiling over any seven days; null when there is none.","title":"Weekly Limit"}},"required":["kind","used_today","daily_limit","remaining_today"],"title":"LinkedInKindUsageReadSchema","type":"object"},"LinkedInLimitMaximumsReadSchema":{"description":"The most each of an account's limits may be set to.\n\nKeyed by the settings update's own field names, so a form reads the\nmaximum for the field it is editing without a map of its own, and the\nnumbers are the ones the update validates against.","properties":{"daily_limit_check_connections":{"title":"Daily Limit Check Connections","type":"integer"},"daily_limit_check_inbox":{"title":"Daily Limit Check Inbox","type":"integer"},"daily_limit_check_sent_invitations":{"title":"Daily Limit Check Sent Invitations","type":"integer"},"daily_limit_connection_request":{"title":"Daily Limit Connection Request","type":"integer"},"daily_limit_follow":{"title":"Daily Limit Follow","type":"integer"},"daily_limit_like_post":{"title":"Daily Limit Like Post","type":"integer"},"daily_limit_profile_view":{"title":"Daily Limit Profile View","type":"integer"},"daily_limit_read_conversation":{"title":"Daily Limit Read Conversation","type":"integer"},"daily_limit_send_message":{"title":"Daily Limit Send Message","type":"integer"},"daily_limit_withdraw":{"title":"Daily Limit Withdraw","type":"integer"},"weekly_connection_request_cap":{"title":"Weekly Connection Request Cap","type":"integer"},"weekly_limit_check_connections":{"title":"Weekly Limit Check Connections","type":"integer"},"weekly_limit_check_inbox":{"title":"Weekly Limit Check Inbox","type":"integer"},"weekly_limit_check_sent_invitations":{"title":"Weekly Limit Check Sent Invitations","type":"integer"},"weekly_limit_follow":{"title":"Weekly Limit Follow","type":"integer"},"weekly_limit_like_post":{"title":"Weekly Limit Like Post","type":"integer"},"weekly_limit_profile_view":{"title":"Weekly Limit Profile View","type":"integer"},"weekly_limit_read_conversation":{"title":"Weekly Limit Read Conversation","type":"integer"},"weekly_limit_send_message":{"title":"Weekly Limit Send Message","type":"integer"},"weekly_limit_withdraw":{"title":"Weekly Limit Withdraw","type":"integer"}},"required":["daily_limit_profile_view","daily_limit_connection_request","daily_limit_send_message","daily_limit_withdraw","daily_limit_follow","daily_limit_like_post","daily_limit_check_sent_invitations","daily_limit_check_inbox","daily_limit_read_conversation","daily_limit_check_connections","weekly_connection_request_cap","weekly_limit_profile_view","weekly_limit_send_message","weekly_limit_withdraw","weekly_limit_follow","weekly_limit_like_post","weekly_limit_check_sent_invitations","weekly_limit_check_inbox","weekly_limit_read_conversation","weekly_limit_check_connections"],"title":"LinkedInLimitMaximumsReadSchema","type":"object"},"LinkedInLookMode":{"description":"What a browser handed a step that may already have touched LinkedIn does first.\n\nBoth look on LinkedIn before anything else; a change already there is the\nstep done. ``verify_then_act`` then finishes a step found not done.\n``verify_only`` never presses: its sequence or contact was paused or\nstopped since it first ran, and a look only records the truth.","enum":["verify_then_act","verify_only"],"title":"LinkedInLookMode","type":"string"},"LinkedInMessageRead":{"additionalProperties":false,"description":"One message read out of an opened conversation.","properties":{"body_text":{"default":"","maxLength":8000,"title":"Body Text","type":"string"},"is_inbound":{"title":"Is Inbound","type":"boolean"},"message_urn":{"maxLength":255,"title":"Message Urn","type":"string"},"sender_member_urn":{"maxLength":128,"title":"Sender Member Urn","type":"string"},"sender_name":{"default":"","maxLength":255,"title":"Sender Name","type":"string"},"sent_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Sent At"}},"required":["message_urn","sender_member_urn","is_inbound"],"title":"LinkedInMessageRead","type":"object"},"LinkedInPresence":{"description":"How recently ANY browser connected to this sender checked in.\n\nThree states, not two, because two different questions are asked of a\nconnection. ``ACTIVE`` answers \"can a step run right now\": a browser is\nopen and heartbeating. ``IDLE`` answers \"is this still set up\": the laptop\nwas closed for the evening. ``NOT_SEEN`` is the one that needs a person:\nnothing has checked in for a day, and queued work is silently waiting.","enum":["active","idle","not_seen"],"title":"LinkedInPresence","type":"string"},"LinkedInQueueState":{"description":"Where one step stands in its account's line, for the people waiting on it.\n\n``RUNNING`` is in a browser now. ``QUEUED`` is in line, with how many are\nahead of it and when it is expected to start. The rest say why the line is\nnot moving for it: a daily or weekly limit reached for its kind, a limit\nset to zero (``KIND_DISABLED``, which no reset lifts), no browser checked\nin for longer than ``offline_warning_seconds``, LinkedIn asking the member\nto verify the account (a checkpoint), or the account disconnected. Not\n\"paused\", which is already what a sequence is when a person stops it.\n\nThe last two were one \"account blocked\" state. They are two because the fix\nis different and the words have to say which: a checkpoint is cleared in\nthe connected Chrome, a disconnect by connecting again.\n\n``OUTSIDE_WINDOW`` is a step whose sequence's sending hours are shut now in\nits sender's timezone (2026-10-01); it outranks every state but the\naccount's own, since nothing else moves it before the hours open.\n\n``CHECKING_REPLIES`` is a LinkedIn message in line that waits for its\nsender's inbox to be read first (2026-10-05): no time is named, since it\ngoes once a check reads the whole inbox.","enum":["running","queued","checking_replies","outside_window","daily_limit","weekly_limit","kind_disabled","browser_offline","verify_account","disconnected"],"title":"LinkedInQueueState","type":"string"},"LinkedInReleaseReason":{"description":"Why a browser handed back a step it holds without settling it.\n\n``verified_absent``: it looked and found the step not done, and may not\nfinish it now (a held or cancelled step's look). ``reopen_paused``: the\nperson closed the working tab again, so this browser stopped reopening it.\nNeither counts against the step: a run cut off under it is reported as an\nattempt instead.","enum":["verified_absent","reopen_paused"],"title":"LinkedInReleaseReason","type":"string"},"LinkedInRepliesCheckReadSchema":{"description":"Whether the sender's LinkedIn inbox is being read, for the messages that wait on it.\n\nA message goes out only on an inbox read in full within the last few hours,\nso it never reaches somebody who has already replied. The sender's tab\nshows only the failing state.","properties":{"failing":{"description":"Whether a message is waiting on a reading of the inbox while the checks keep failing since last_read_at.","title":"Failing","type":"boolean"},"holding":{"default":false,"description":"Whether LinkedIn messages wait for a reading of the inbox right now; false once the checks have failed for long enough that they go without one.","title":"Holding","type":"boolean"},"last_read_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the whole inbox was last read; null when no reading has worked yet.","title":"Last Read At"}},"required":["last_read_at","failing"],"title":"LinkedInRepliesCheckReadSchema","type":"object"},"LinkedInRunPhase":{"description":"How far a build that resumes says a running step got, on each check-in.\n\n``claimed``: handed over, nothing done. ``navigated``: on the page.\n``dispatched``: the step's own work started. ``committing``: a press that\nchanges LinkedIn was granted and is under way. ``committed``: it was made.\nInformation for the team and for the next look; the grant, not the\nphase, is what says something may have happened.","enum":["claimed","navigated","dispatched","committing","committed"],"title":"LinkedInRunPhase","type":"string"},"LinkedInScheduleBlock":{"description":"The one thing that stops a batch of approved steps from running as scheduled.","enum":["browser_offline","account_blocked","weekly_limit","kind_disabled","outside_window"],"title":"LinkedInScheduleBlock","type":"string"},"LinkedInSenderLeaderboardRowReadSchema":{"description":"One LinkedIn-connected sender's outcomes. Null = unknowable.","properties":{"connections_accepted":{"title":"Connections Accepted","type":"integer"},"connections_sent":{"title":"Connections Sent","type":"integer"},"messages_sent":{"title":"Messages Sent","type":"integer"},"replies":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replies"},"sender_profile_id":{"format":"uuid","title":"Sender Profile Id","type":"string"},"sender_profile_name":{"title":"Sender Profile Name","type":"string"}},"required":["sender_profile_id","sender_profile_name","connections_sent","connections_accepted","messages_sent","replies"],"title":"LinkedInSenderLeaderboardRowReadSchema","type":"object"},"LinkedInSettingsUpdateSchema":{"properties":{"daily_limit_check_connections":{"anyOf":[{"maximum":100.0,"minimum":0.0,"type":"integer"},{}],"description":"Readings of the sender's newest connections a day, which notice accepted connection requests. Zero stops them.","title":"Daily Limit Check Connections"},"daily_limit_check_inbox":{"anyOf":[{"maximum":100.0,"minimum":0.0,"type":"integer"},{}],"title":"Daily Limit Check Inbox"},"daily_limit_check_sent_invitations":{"anyOf":[{"maximum":100.0,"minimum":0.0,"type":"integer"},{}],"title":"Daily Limit Check Sent Invitations"},"daily_limit_connection_request":{"anyOf":[{"maximum":200.0,"minimum":0.0,"type":"integer"},{}],"title":"Daily Limit Connection Request"},"daily_limit_follow":{"anyOf":[{"maximum":200.0,"minimum":0.0,"type":"integer"},{}],"title":"Daily Limit Follow"},"daily_limit_like_post":{"anyOf":[{"maximum":200.0,"minimum":0.0,"type":"integer"},{}],"title":"Daily Limit Like Post"},"daily_limit_profile_view":{"anyOf":[{"maximum":500.0,"minimum":0.0,"type":"integer"},{}],"title":"Daily Limit Profile View"},"daily_limit_read_conversation":{"anyOf":[{"maximum":500.0,"minimum":0.0,"type":"integer"},{}],"title":"Daily Limit Read Conversation"},"daily_limit_send_message":{"anyOf":[{"maximum":500.0,"minimum":0.0,"type":"integer"},{}],"description":"Messages and InMails a day, counted together.","title":"Daily Limit Send Message"},"daily_limit_withdraw":{"anyOf":[{"maximum":200.0,"minimum":0.0,"type":"integer"},{}],"title":"Daily Limit Withdraw"},"min_action_interval_seconds":{"anyOf":[{"maximum":3600.0,"minimum":60.0,"type":"integer"},{}],"description":"The least time between two steps on this account, in seconds, from 60 to 3,600. The gap actually waited is widened at random by up to 40%, so steps never land on an exact cadence.","title":"Min Action Interval Seconds"},"run_mode":{"anyOf":[{"$ref":"#/components/schemas/LinkedInApprovalMode"},{},{"type":"null"}],"description":"Whether a person approves this sender's LinkedIn steps on Tasks before they run (manual) or they are queued without asking (auto). Switching to manual takes back the steps queued without asking that no browser has started; switching to auto queues the ones that waited only for this setting. Null returns it to never set, which runs as manual.","title":"Run Mode"},"weekly_connection_request_cap":{"anyOf":[{"maximum":1000.0,"minimum":0.0,"type":"integer"},{}],"title":"Weekly Connection Request Cap"},"weekly_limit_check_connections":{"anyOf":[{"maximum":700.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Check Connections"},"weekly_limit_check_inbox":{"anyOf":[{"maximum":700.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Check Inbox"},"weekly_limit_check_sent_invitations":{"anyOf":[{"maximum":700.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Check Sent Invitations"},"weekly_limit_follow":{"anyOf":[{"maximum":1400.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Follow"},"weekly_limit_like_post":{"anyOf":[{"maximum":1400.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Like Post"},"weekly_limit_profile_view":{"anyOf":[{"maximum":3500.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Profile View"},"weekly_limit_read_conversation":{"anyOf":[{"maximum":3500.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Read Conversation"},"weekly_limit_send_message":{"anyOf":[{"maximum":3500.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Send Message"},"weekly_limit_withdraw":{"anyOf":[{"maximum":1400.0,"minimum":0.0,"type":"integer"},{},{"type":"null"}],"title":"Weekly Limit Withdraw"}},"title":"LinkedInSettingsUpdateSchema","type":"object"},"LinkedInSkipReason":{"description":"The specific reason a step was not applicable, when the driver knows one.\n\nNarrower than the error code beside it: ``not_applicable`` says the step\ncould not apply, and this says why in a way a customer can act on. An\ninvitation already pending is their own earlier work, while \"connect not\noffered\" is LinkedIn's decision about that profile.","enum":["invitation_already_pending","connect_not_offered","email_required","message_not_offered","no_invitation_pending","already_connected","profile_not_resolved","vanity_changed"],"title":"LinkedInSkipReason","type":"string"},"LinkedInStatsReadSchema":{"properties":{"avg_duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Duration Ms"},"failed":{"title":"Failed","type":"integer"},"rejected":{"title":"Rejected","type":"integer"},"skipped":{"title":"Skipped","type":"integer"},"succeeded":{"title":"Succeeded","type":"integer"},"total":{"title":"Total","type":"integer"}},"required":["total","succeeded","failed","rejected","skipped","avg_duration_ms"],"title":"LinkedInStatsReadSchema","type":"object"},"LinkedInStreamEventSchema":{"description":"One frame of the sender's live stream, as the documentation describes it.\n\nThe stream is a wake-up channel, not a data channel: every frame names what\nchanged and the client re-reads. ``kind`` is the SSE ``event:`` field:\n``hello``, ``resync``, ``reconnect``, or one of the account signals\n(``state_changed``, ``disconnected``, ``action_queued``, ``action_cancelled``).","properties":{"account_id":{"format":"uuid","title":"Account Id","type":"string"},"action_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Action Id"},"at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"At"},"kind":{"title":"Kind","type":"string"}},"required":["kind","account_id"],"title":"LinkedInStreamEventSchema","type":"object"},"LinkedInTryConnectionRequestSchema":{"additionalProperties":false,"description":"Send the person a connection request, with or without a note.","properties":{"kind":{"const":"connection_request","title":"Kind","type":"string"},"note":{"default":"","description":"The note, up to the 200 characters a free LinkedIn account will send. Empty sends none.","maxLength":200,"title":"Note","type":"string"},"profile_url":{"description":"Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.","maxLength":512,"minLength":1,"title":"Profile Url","type":"string"}},"required":["kind","profile_url"],"title":"LinkedInTryConnectionRequestSchema","type":"object"},"LinkedInTryFollowContactSchema":{"additionalProperties":false,"description":"Follow the person without connecting.","properties":{"kind":{"const":"follow_contact","title":"Kind","type":"string"},"profile_url":{"description":"Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.","maxLength":512,"minLength":1,"title":"Profile Url","type":"string"}},"required":["kind","profile_url"],"title":"LinkedInTryFollowContactSchema","type":"object"},"LinkedInTryLikeLatestPostSchema":{"additionalProperties":false,"description":"Like the person's latest post.","properties":{"kind":{"const":"like_latest_post","title":"Kind","type":"string"},"profile_url":{"description":"Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.","maxLength":512,"minLength":1,"title":"Profile Url","type":"string"}},"required":["kind","profile_url"],"title":"LinkedInTryLikeLatestPostSchema","type":"object"},"LinkedInTryProfileViewSchema":{"additionalProperties":false,"description":"View the person's profile.","properties":{"kind":{"const":"profile_view","title":"Kind","type":"string"},"profile_url":{"description":"Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.","maxLength":512,"minLength":1,"title":"Profile Url","type":"string"}},"required":["kind","profile_url"],"title":"LinkedInTryProfileViewSchema","type":"object"},"LinkedInTrySendMessageSchema":{"additionalProperties":false,"description":"Send the person a message, opened from their profile.","properties":{"body":{"description":"The message.","maxLength":8000,"minLength":1,"title":"Body","type":"string"},"kind":{"const":"send_message","title":"Kind","type":"string"},"profile_url":{"description":"Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.","maxLength":512,"minLength":1,"title":"Profile Url","type":"string"}},"required":["kind","profile_url","body"],"title":"LinkedInTrySendMessageSchema","type":"object"},"LinkedInTryStepSchema":{"additionalProperties":false,"description":"Queue one step by hand, to watch the channel work.\n\nOnly the kinds the extension implements that act on one named profile. An\nInMail spends the sender's own Premium credits, and the reads of the\nsender's own lists act on nobody, so neither is offered. Each kind carries\nonly its own inputs: a note for a connection request, a body for a message.","properties":{"step":{"description":"What to do, and to whom.","discriminator":{"mapping":{"connection_request":"#/components/schemas/LinkedInTryConnectionRequestSchema","follow_contact":"#/components/schemas/LinkedInTryFollowContactSchema","like_latest_post":"#/components/schemas/LinkedInTryLikeLatestPostSchema","profile_view":"#/components/schemas/LinkedInTryProfileViewSchema","send_message":"#/components/schemas/LinkedInTrySendMessageSchema","withdraw_connection_request":"#/components/schemas/LinkedInTryWithdrawConnectionRequestSchema"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/LinkedInTryProfileViewSchema"},{"$ref":"#/components/schemas/LinkedInTryConnectionRequestSchema"},{"$ref":"#/components/schemas/LinkedInTrySendMessageSchema"},{"$ref":"#/components/schemas/LinkedInTryWithdrawConnectionRequestSchema"},{"$ref":"#/components/schemas/LinkedInTryFollowContactSchema"},{"$ref":"#/components/schemas/LinkedInTryLikeLatestPostSchema"}],"title":"Step"}},"required":["step"],"title":"LinkedInTryStepSchema","type":"object"},"LinkedInTryWithdrawConnectionRequestSchema":{"additionalProperties":false,"description":"Withdraw the connection request pending to the person.","properties":{"kind":{"const":"withdraw_connection_request","title":"Kind","type":"string"},"profile_url":{"description":"Whose profile, in any shape LinkedIn uses. A connection request to them must be pending: it is the one withdrawn.","maxLength":512,"minLength":1,"title":"Profile Url","type":"string"}},"required":["kind","profile_url"],"title":"LinkedInTryWithdrawConnectionRequestSchema","type":"object"},"LinkedInWaitReadSchema":{"description":"What the account's next step is waiting on, and until when.","properties":{"next_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the next step may start: the end of the time between steps for pacing, the reset for daily_cap and weekly_cap, when the hours open for outside_window, and null otherwise.","title":"Next At"},"reason":{"$ref":"#/components/schemas/LinkedInWaitReason","description":"The one reason the next step has not started, highest first: not_connected, checkpoint, lease_held_elsewhere (another browser drives the account), in_flight (a step is running), outside_window (the work that could run waits for its sequences' sending hours, in the sender's timezone), idle (nothing is queued; a step that waits for a person waits on Tasks before it is queued), daily_cap, weekly_cap or kind_disabled (every kind that could run is held by a limit, or a limit set to zero), pacing (the time between steps), or ready."},"resets_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The moment a daily or weekly limit next frees a slot, midnight in the sender's timezone; null for every other reason. A moment, never 'today' or 'tomorrow'.","title":"Resets At"}},"required":["reason","next_at","resets_at"],"title":"LinkedInWaitReadSchema","type":"object"},"LinkedInWaitReason":{"description":"Why an account's next step has not started, as one reason, highest first.\n\n``OUTSIDE_WINDOW`` is work that could run but for its run window, shut now\nin the sender's timezone (2026-10-01); ``IDLE`` is nothing waiting in line.\n``DAILY_CAP``, ``WEEKLY_CAP`` and ``KIND_DISABLED`` are named only when\nevery kind that could be handed out is held by one. ``CHECKING_REPLIES``\nis a message waiting for the inbox to be read first (2026-10-05): one is\nnever sent on an inbox last read hours ago, or past a reply nobody has\nread yet. ``PACING`` is the time between steps, ``READY`` a step that may\nstart now. ``INSUFFICIENT_CREDITS`` is a workspace with no credit left: the\ngovernor's own reading never names it (it reserves nothing), and the\ndashboard's account read puts it over the reasons a balance outranks\n(2026-10-06), as the side panel does off a refused claim.","enum":["not_connected","checkpoint","lease_held_elsewhere","in_flight","outside_window","idle","daily_cap","weekly_cap","kind_disabled","checking_replies","pacing","ready","insufficient_credits"],"title":"LinkedInWaitReason","type":"string"},"ListIntegrationTypesFilterParamsSchema":{"description":"Filter parameters for listing integration types.","properties":{"boost_categories":{"anyOf":[{"items":{"maxLength":255,"type":"string"},"maxItems":50,"type":"array"},{"type":"null"}],"description":"Category slugs to boost. Integrations in these categories appear first in results.","title":"Boost Categories"},"category_slug":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Filter integration types by category slug","title":"Category Slug"},"kind":{"anyOf":[{"$ref":"#/components/schemas/IntegrationKindFilter"},{"type":"null"}],"description":"Filter by integration kind"},"record_type__in":{"anyOf":[{"items":{"maxLength":255,"type":"string"},"maxItems":50,"type":"array"},{"type":"null"}],"description":"Filter to integration types that sync any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.","title":"Record Type  In"},"search":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Search integration types by name or description","title":"Search"}},"title":"ListIntegrationTypesFilterParamsSchema","type":"object"},"ListIntegrationsFilterParamsSchema":{"description":"Filter parameters for list and count integration endpoints.","properties":{"integration_type__not":{"anyOf":[{"items":{"maxLength":255,"type":"string"},"maxItems":50,"type":"array"},{"type":"null"}],"description":"Exclude integrations with these integration types","title":"Integration Type  Not"},"kind":{"anyOf":[{"$ref":"#/components/schemas/IntegrationKindFilter"},{"type":"null"}],"description":"Filter by integration kind (source, destination, or both)"},"record_type__in":{"anyOf":[{"items":{"maxLength":255,"type":"string"},"maxItems":50,"type":"array"},{"type":"null"}],"description":"Filter to integrations that handle any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.","title":"Record Type  In"},"search":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Search integrations by name or type. Multi-word queries use AND logic.","title":"Search"}},"title":"ListIntegrationsFilterParamsSchema","type":"object"},"ListOutreachActivityFilterParamsSchema":{"description":"Query parameters narrowing a sender's Activity.\n\nEvery filter is optional and repeatable where it takes a list; omitted, it\nlets everything through. A sender's page passes its own sender.","properties":{"channel":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaskChannel"},"type":"array"},{"type":"null"}],"description":"Only these channels (`email`, `linkedin`); omit for both.","title":"Channel"},"decision":{"anyOf":[{"items":{"$ref":"#/components/schemas/ActivityDecision"},"type":"array"},{"type":"null"}],"description":"Only what was decided this way: `approved` (a person or an API key approved it before it went), `automatic` (no person decided: the rules let it go), `rejected` (a person refused it, so it never went), `sent_by_person` (a person wrote and sent it from the inbox), `not_recorded` (a LinkedIn step from before Activity whose approval was not kept).","title":"Decision"},"kind":{"anyOf":[{"items":{"maxLength":32,"minLength":1,"type":"string"},"type":"array"},{"type":"null"}],"description":"Only these kinds: a LinkedIn action slug (`connection_request`, `send_message`, …), `email` for a sequence's email, or `reply` for a reply from the inbox.","title":"Kind"},"occurred_after":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only what happened at or after this instant, with its timezone offset.","title":"Occurred After"},"occurred_before":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only what happened before this instant, with its timezone offset.","title":"Occurred Before"},"outcome":{"anyOf":[{"items":{"$ref":"#/components/schemas/ActivityOutcome"},"type":"array"},{"type":"null"}],"description":"Only what ended this way: `sent` (an email the provider accepted), `done` (a LinkedIn step that did its job), `failed`, `skipped`, `already_pending` (a connection request somebody had already sent), `stopped`, `not_sent` (refused).","title":"Outcome"},"search":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.","title":"Search"},"sender_profile_id":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only what went out as these senders; omit for every sender.","title":"Sender Profile Id"},"sequence_id":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only what these sequences sent; omit for all of them.","title":"Sequence Id"}},"title":"ListOutreachActivityFilterParamsSchema","type":"object"},"ListOutreachTasksFilterParamsSchema":{"description":"Query parameters narrowing the queue.\n\n``status`` defaults to pending because that is the queue: what is waiting\non a person. The other tabs pass their own statuses, several at once for\na history view.","properties":{"ask_reason":{"anyOf":[{"items":{"$ref":"#/components/schemas/AskReason"},"type":"array"},{"type":"null"}],"description":"Only tasks held for a person for one of these reasons (repeatable): the Tasks page's Held because. Omit for every reason.","title":"Ask Reason"},"channel":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaskChannel"},"type":"array"},{"type":"null"}],"description":"Only these channels; omit for every channel.","title":"Channel"},"enrolment_id":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only the tasks of these contacts, by their enrolment in a sequence; omit for everyone.","title":"Enrolment Id"},"kind":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"Only these kinds: a LinkedIn action slug (`profile_view`, `connection_request`, …) or `email`. Omit for every kind.","title":"Kind"},"outcome":{"anyOf":[{"items":{"maxLength":32,"minLength":1,"type":"string"},"type":"array"},{"type":"null"}],"description":"Only tasks that ended with one of these words (repeatable): `failed`, `skipped`, `stopped`, `succeeded` and the like. The Failed view is `status=cancelled` with `outcome=failed`. Omit for however they ended.","title":"Outcome"},"search":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.","title":"Search"},"sender_profile_id":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only these senders; omit for everyone.","title":"Sender Profile Id"},"sequence_id":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only these sequences; omit for all of them.","title":"Sequence Id"},"status":{"description":"Only these statuses; repeat the parameter for several. Defaults to pending.","items":{"$ref":"#/components/schemas/TaskStatus"},"title":"Status","type":"array"},"waiting_since_before":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only tasks that entered the queue before this instant, which is 'waiting longer than'. Read off when the task was created, not when its channel would run it. Omit for however long they have been here.","title":"Waiting Since Before"}},"title":"ListOutreachTasksFilterParamsSchema","type":"object"},"ListReferralsFilterParamsSchema":{"description":"Query parameters for narrowing the referral list.","properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/ReferralStatus"},{"type":"null"}],"description":"Narrow to friends still on a free plan, or only those on a paid plan. The two are disjoint; omit for everything."}},"title":"ListReferralsFilterParamsSchema","type":"object"},"ListTableRunsFilterParamsSchema":{"description":"Query parameters for filtering table runs.","properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/TableRunStatus"},{"type":"null"}],"description":"Filter by run status."},"trigger":{"anyOf":[{"$ref":"#/components/schemas/TableRunTrigger"},{"type":"null"}],"description":"Filter by run trigger."}},"title":"ListTableRunsFilterParamsSchema","type":"object"},"ListTablesFilterParamsSchema":{"description":"Query parameters for filtering tables.","properties":{"archived":{"$ref":"#/components/schemas/ArchivedScope","default":"exclude","description":"exclude (the default) leaves archived tables out, as the list does; include lists them beside the rest, as search does; only lists them alone, as the Archived view does."},"created_at__after":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Filter by created_at after this instant (ISO 8601).","title":"Created At  After"},"created_at__before":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Filter by created_at before this instant (ISO 8601).","title":"Created At  Before"},"folder_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Only the tables directly in this folder. Leave it and top_level out to reach every folder, as search does.","title":"Folder Id"},"name__contains":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Filter by name (case-insensitive contains).","title":"Name  Contains"},"owner_user_id":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"Filter to tables this workspace member owns.","title":"Owner User Id"},"top_level":{"default":false,"description":"Only the tables in no folder: the top level of the Tables list.","title":"Top Level","type":"boolean"},"unowned":{"default":false,"description":"Only tables that nobody owns.","title":"Unowned","type":"boolean"}},"title":"ListTablesFilterParamsSchema","type":"object"},"ListTrashedSequencesFilterParamsSchema":{"description":"Query parameters for filtering the sequences in Trash.","properties":{"name__contains":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Only the sequences whose name holds this text, in any case.","title":"Name  Contains"}},"title":"ListTrashedSequencesFilterParamsSchema","type":"object"},"ListTrashedTablesFilterParamsSchema":{"description":"Query parameters for filtering the tables in Trash.","properties":{"name__contains":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Filter by name (case-insensitive contains).","title":"Name  Contains"}},"title":"ListTrashedTablesFilterParamsSchema","type":"object"},"LocalBusinessQuerySchema":{"description":"Filters for a map search over business listings.\n\nThe one search here that asks \"who is within this radius\". Name a category,\na business name or a website to look for, plus an area to look in for the\nradius part.","properties":{"area":{"anyOf":[{"$ref":"#/components/schemas/GeoFilterSchema"},{"type":"null"}],"description":"Where to search, and how far around it."},"categories":{"description":"Business categories to include, in the data source's own vocabulary.","items":{"type":"string"},"maxItems":10,"title":"Categories","type":"array"},"description":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"description":"Words in the business description.","title":"Description"},"domain":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"description":"Only the listing on this domain.","title":"Domain"},"has_phone":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only listings that do (or do not) show a phone number."},"has_website":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only listings that do (or do not) link a website."},"is_claimed":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Only listings the owner has (or has not) claimed."},"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"description":"Words in the business name.","title":"Name"},"price_level":{"description":"Price bands to include: inexpensive, moderate, expensive or very_expensive.","items":{"enum":["inexpensive","moderate","expensive","very_expensive"],"type":"string"},"maxItems":4,"title":"Price Level","type":"array"},"rating":{"anyOf":[{"$ref":"#/components/schemas/DecimalRangeFilterSchema"},{"type":"null"}],"description":"Star rating range, out of five."},"review_count":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many reviews the listing has."}},"title":"LocalBusinessQuerySchema","type":"object"},"LookalikeMatch":{"description":"How close a similarity search has to be: one choice that tunes two knobs.\n\nThe two knobs used to be typed as numbers, a ranking weight from -1 to 1\nand a score floor from 0 to 1, and both read like every other filter on\nthe page while meaning something no other filter means. Three named\nlevels say what a person actually wants; ``LOOKALIKE_TUNINGS`` says what\neach one sends and keeps.","enum":["broad","balanced","exact"],"title":"LookalikeMatch","type":"string"},"LookalikeQuerySchema":{"description":"Filters for a search for companies resembling a set of seed companies.","properties":{"match":{"$ref":"#/components/schemas/LookalikeMatch","default":"balanced","description":"How close a match to look for. Broad favours larger, more established companies and keeps every match. Balanced is the default ranking. Exact favours the companies most like the seeds and keeps only the closest matches, so it can add fewer rows than the count shows."},"seed_domains":{"description":"The company domains to find lookalikes of, between 1 and 10. At least one is required, since nothing else can anchor a similarity search.","items":{"type":"string"},"maxItems":10,"title":"Seed Domains","type":"array"}},"title":"LookalikeQuerySchema","type":"object"},"LookupConnectionSchema":{"description":"One org connection with the record types it can look records up in.","properties":{"health_status":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The connection's last recorded health, or null when never checked.","title":"Health Status"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The system's directory logo; null when the directory has none.","title":"Icon Url"},"integration_id":{"format":"uuid","title":"Integration Id","type":"string"},"integration_type":{"description":"The system behind the connection, e.g. 'clerk'.","title":"Integration Type","type":"string"},"name":{"description":"The connection's own name, as its owner spelled it.","title":"Name","type":"string"},"record_types":{"items":{"$ref":"#/components/schemas/LookupRecordTypeSchema"},"title":"Record Types","type":"array"}},"required":["integration_id","integration_type","name","icon_url","health_status","record_types"],"title":"LookupConnectionSchema","type":"object"},"LookupIdentityFieldsSchema":{"description":"The identity fields one live connection accepts for one record type.","properties":{"identity_fields":{"description":"The fields a lookup may key on, in the connection's own order.","items":{"type":"string"},"title":"Identity Fields","type":"array"}},"required":["identity_fields"],"title":"LookupIdentityFieldsSchema","type":"object"},"LookupRecordTypeSchema":{"description":"One record type a connection can fetch single records of.","properties":{"display_name":{"description":"The record type's human name, e.g. 'User'.","title":"Display Name","type":"string"},"identity_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"The fields a lookup may key on ('id', 'email', ...), in the connection's own order. Null when the listing's best-effort probe could not learn them in budget. The record type is still lookupable, and the identity-fields endpoint answers live.","title":"Identity Fields"},"slug":{"description":"The record type's stable slug, e.g. 'user'.","title":"Slug","type":"string"}},"required":["slug","display_name","identity_fields"],"title":"LookupRecordTypeSchema","type":"object"},"LookupSettings":{"description":"Settings for the cross-table lookup actions.\n\nColumns are named rather than identified: whoever configures this is\nreading the other table's headers, and a name that stops resolving is a\nmessage worth showing rather than a silently blank column.","properties":{"kind":{"const":"lookup","default":"lookup","title":"Kind","type":"string"},"match_column":{"default":"","description":"The column in that table whose value must equal this row's value.","maxLength":255,"title":"Match Column","type":"string"},"return_column":{"default":"","description":"The column to bring back; empty returns the whole row.","maxLength":255,"title":"Return Column","type":"string"},"table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The other table this column reads.","title":"Table Id"}},"title":"LookupSettings","type":"object"},"MailboxActivityPointSchema":{"description":"One day of the mailbox detail chart.\n\nThree DISJOINT counts, which is why \"received\" is gone. It was all inbound\nmail (replies plus out-of-office plus bounces), so it contained `replies`\nrather than standing beside it, and two lines where one is a slice of the\nother read as two measures of the same thing. Bounces is the half of the\nold total anybody acts on; out-of-office is the half nobody does.","properties":{"bounces":{"title":"Bounces","type":"integer"},"day":{"format":"date-time","title":"Day","type":"string"},"replies":{"title":"Replies","type":"integer"},"sent":{"title":"Sent","type":"integer"}},"required":["day","sent","replies","bounces"],"title":"MailboxActivityPointSchema","type":"object"},"MailboxActivityReadSchema":{"properties":{"bounces":{"items":{"$ref":"#/components/schemas/MailboxBounceSchema"},"title":"Bounces","type":"array"},"points":{"items":{"$ref":"#/components/schemas/MailboxActivityPointSchema"},"title":"Points","type":"array"},"providers":{"items":{"$ref":"#/components/schemas/MailboxRecipientProviderSchema"},"title":"Providers","type":"array"}},"required":["points","providers","bounces"],"title":"MailboxActivityReadSchema","type":"object"},"MailboxBounceSchema":{"properties":{"at":{"format":"date-time","title":"At","type":"string"},"recipient":{"title":"Recipient","type":"string"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},"required":["recipient","severity","at"],"title":"MailboxBounceSchema","type":"object"},"MailboxBulkUpdateResponseSchema":{"properties":{"updated":{"title":"Updated","type":"integer"}},"required":["updated"],"title":"MailboxBulkUpdateResponseSchema","type":"object"},"MailboxBulkUpdateSchema":{"description":"One edit applied to many mailboxes.\n\nA field omitted from the request is left unchanged on every mailbox; a\nfield sent explicitly (even as an empty string) is applied to all of them.","properties":{"daily_send_limit":{"anyOf":[{"maximum":2000.0,"minimum":1.0,"type":"integer"},{}],"title":"Daily Send Limit"},"mailbox_ids":{"items":{"format":"uuid","type":"string"},"maxItems":500,"minItems":1,"title":"Mailbox Ids","type":"array"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{},{"type":"null"}],"title":"Sender Profile Id"}},"required":["mailbox_ids"],"title":"MailboxBulkUpdateSchema","type":"object"},"MailboxConnectionStatus":{"description":"Whether the mailbox's grant currently authenticates.","enum":["connected","disconnected"],"title":"MailboxConnectionStatus","type":"string"},"MailboxHealth":{"description":"The three states the Status column draws, as one filterable value.\n\nDERIVED, never stored: it folds ``connection_status`` together with whether\n``last_verified_at`` holds a stamp. A mailbox nobody has checked since it\nconnected and one checked this morning are different answers to \"is this\ngrant still good?\", and the ops screen has to be able to ask for either.\n\nDeliberately NOT members of :class:`MailboxConnectionStatus`. That enum is\nthe stored column type and the value on every mailbox response, and eleven\nplaces in the domain compare against ``CONNECTED`` by identity. A third\nmember there would put a value on the wire that no row can hold and would\nsilently weaken every one of those checks. Two callers also already send\n``connection_status=connected`` meaning \"not broken\" (the send-a-test picker\nand the notification settings page), and they must keep that meaning.","enum":["verified","connected","disconnected"],"title":"MailboxHealth","type":"string"},"MailboxImpactAction":{"description":"What is about to happen to a mailbox, for counting who it affects.","enum":["delete","unassign","move"],"title":"MailboxImpactAction","type":"string"},"MailboxIssue":{"description":"Why the mailbox a contact is emailed from cannot send for them right now.\n\nRead at the time, never stored. The first two stop the contact, because\nnothing on its own brings the address back to this sequence; the last two\nmake them wait, because a reconnect or a sender does.","enum":["deleted","not_on_sequence","disconnected","no_sender"],"title":"MailboxIssue","type":"string"},"MailboxOverviewReadSchema":{"properties":{"connected_mailboxes":{"title":"Connected Mailboxes","type":"integer"},"daily_ceiling":{"description":"Sum of every connected mailbox's daily send limit.","title":"Daily Ceiling","type":"integer"},"disconnected_mailboxes":{"title":"Disconnected Mailboxes","type":"integer"},"remaining_today":{"description":"Workspace capacity left today: sum over connected mailboxes of max(0, daily send limit - sent today). Zero when no mailbox is connected, not a missing number.","title":"Remaining Today","type":"integer"},"sent_today":{"title":"Sent Today","type":"integer"},"sent_yesterday":{"title":"Sent Yesterday","type":"integer"},"total_mailboxes":{"title":"Total Mailboxes","type":"integer"}},"required":["total_mailboxes","connected_mailboxes","disconnected_mailboxes","sent_today","sent_yesterday","daily_ceiling","remaining_today"],"title":"MailboxOverviewReadSchema","type":"object"},"MailboxPageSchema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MailboxReadSchema"},"title":"Items","type":"array"},"total":{"title":"Total","type":"integer"}},"required":["items","total"],"title":"MailboxPageSchema","type":"object"},"MailboxProvider":{"description":"Which email provider a mailbox connects through.\n\nOnly Google Workspace ships so far; every provider is implemented behind\n``providers.EmailProviderBase`` so Office 365 and IMAP/SMTP can be added\nlater without touching callers.\n\n``GOOGLE_WORKSPACE`` holds a per-mailbox OAuth grant (consent screen,\nrefresh token). ``GOOGLE_WORKSPACE_DWD`` holds no grant at all: tokens are\nminted on demand via domain-wide delegation as the platform service\naccount, so its rows carry an empty ``refresh_token`` forever. It is the path\nimported fleets (e.g. InboxKit) connect through.","enum":["google_workspace","google_workspace_dwd"],"title":"MailboxProvider","type":"string"},"MailboxReadSchema":{"properties":{"bounce_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"DSNs / accepted sends, lifetime.","title":"Bounce Rate"},"connection_status":{"$ref":"#/components/schemas/MailboxConnectionStatus"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"daily_send_limit":{"title":"Daily Send Limit","type":"integer"},"disconnected_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Disconnected At"},"disconnected_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disconnected Reason"},"email_address":{"title":"Email Address","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"last_verified_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the grant last passed its check.","title":"Last Verified At"},"provider":{"$ref":"#/components/schemas/MailboxProvider"},"reply_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Genuine replies / accepted sends, lifetime.","title":"Reply Rate"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sender Profile Id"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"usage":{"anyOf":[{"$ref":"#/components/schemas/MailboxUsageReadSchema"},{"type":"null"}]}},"required":["id","sender_profile_id","provider","email_address","connection_status","daily_send_limit","disconnected_at","disconnected_reason","created_at","updated_at"],"title":"MailboxReadSchema","type":"object"},"MailboxRecipientProviderSchema":{"properties":{"count":{"title":"Count","type":"integer"},"domain":{"title":"Domain","type":"string"}},"required":["domain","count"],"title":"MailboxRecipientProviderSchema","type":"object"},"MailboxRemovalAction":{"description":"What removing the InboxKit connection does to its imported mailboxes.\n\nDISCONNECT keeps the mailbox rows and their history; DELETE removes them\noutright (cascading their inbox threads and messages).","enum":["disconnect","delete"],"title":"MailboxRemovalAction","type":"string"},"MailboxRemovalImpactReadSchema":{"description":"Who deleting, unassigning or moving mailboxes reaches, counted before it happens.","properties":{"emailed_contacts":{"description":"Every contact these mailboxes have ever emailed; no other mailbox emails them.","title":"Emailed Contacts","type":"integer"},"sequences":{"items":{"$ref":"#/components/schemas/MailboxSequenceImpactSchema"},"title":"Sequences","type":"array"},"stopped":{"description":"Live contacts the change stops. A contact is only ever emailed from the mailbox that first emailed them, so they are never moved to another one.","title":"Stopped","type":"integer"},"waiting":{"description":"Live contacts left waiting until the mailbox is back on a sender.","title":"Waiting","type":"integer"}},"required":["stopped","waiting","sequences","emailed_contacts"],"title":"MailboxRemovalImpactReadSchema","type":"object"},"MailboxSequenceImpactSchema":{"description":"One sequence a mailbox change reaches, and how many of its contacts.","properties":{"sequence_id":{"format":"uuid","title":"Sequence Id","type":"string"},"sequence_name":{"title":"Sequence Name","type":"string"},"stopped":{"description":"Live contacts in this sequence the change stops.","title":"Stopped","type":"integer"},"waiting":{"description":"Live contacts in this sequence left waiting for the mailbox.","title":"Waiting","type":"integer"}},"required":["sequence_id","sequence_name","stopped","waiting"],"title":"MailboxSequenceImpactSchema","type":"object"},"MailboxUpdateSchema":{"description":"A mailbox's own settings: how much it may send, and who it sends as.\n\nName and signature are NOT here. They belong to the sender, so a\nperson running six inboxes has one identity instead of six copies of it.","properties":{"daily_send_limit":{"anyOf":[{"maximum":2000.0,"minimum":1.0,"type":"integer"},{}],"title":"Daily Send Limit"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{},{"type":"null"}],"title":"Sender Profile Id"}},"title":"MailboxUpdateSchema","type":"object"},"MailboxUsageReadSchema":{"description":"Volume only; the ceiling it runs against is the mailbox's `daily_send_limit`.","properties":{"sent_today":{"title":"Sent Today","type":"integer"},"sent_yesterday":{"title":"Sent Yesterday","type":"integer"}},"required":["sent_today","sent_yesterday"],"title":"MailboxUsageReadSchema","type":"object"},"ManualColumnDefinition":{"description":"Definition of a manual column: typed, user-editable cells.","properties":{"default_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Default Value"},"kind":{"const":"manual","default":"manual","title":"Kind","type":"string"}},"title":"ManualColumnDefinition","type":"object"},"MatchLeadValuesRequestSchema":{"description":"A pasted list of values to check against one of the product's closed vocabularies.","properties":{"field":{"$ref":"#/components/schemas/LeadVocabularyField","description":"Which closed vocabulary to check the values against: departments, past_departments, management_levels, past_management_levels, company_size_bands, department (the signal search's own list), company_industry, past_company_industry, industry, company_type (the People search's current employer type and the Companies search's own type share this list) or past_company_type."},"values":{"description":"The raw values, in whatever case or spacing they were pasted or typed in.","items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":200,"minItems":1,"title":"Values","type":"array"}},"required":["field","values"],"title":"MatchLeadValuesRequestSchema","type":"object"},"MatchedLeadValuesSchema":{"description":"Every pasted value's outcome, in the order it was sent.","properties":{"matches":{"items":{"$ref":"#/components/schemas/LeadValueMatchSchema"},"title":"Matches","type":"array"}},"required":["matches"],"title":"MatchedLeadValuesSchema","type":"object"},"McpCatalogListResponseSchema":{"description":"The curated MCP catalog, merged with the org's connection state.","properties":{"tiles":{"items":{"$ref":"#/components/schemas/McpCatalogTileSchema"},"title":"Tiles","type":"array"}},"required":["tiles"],"title":"McpCatalogListResponseSchema","type":"object"},"McpCatalogTileSchema":{"description":"One curated MCP server as the connect gallery renders it.","properties":{"account_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Label"},"connected_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connected By User Id"},"icon":{"title":"Icon","type":"string"},"name":{"title":"Name","type":"string"},"scope_note":{"title":"Scope Note","type":"string"},"server_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Server Id"},"slug":{"title":"Slug","type":"string"},"state":{"description":"'not_connected', 'active' or 'needs_reconnect'.","title":"State","type":"string"},"url":{"title":"Url","type":"string"}},"required":["slug","name","icon","url","scope_note","state","server_id","account_label","connected_by_user_id"],"title":"McpCatalogTileSchema","type":"object"},"McpOauthCallbackRequestSchema":{"description":"The provider redirect's payload, relayed by the frontend callback page.","properties":{"code":{"maxLength":4096,"minLength":1,"title":"Code","type":"string"},"state":{"maxLength":256,"minLength":1,"title":"State","type":"string"}},"required":["code","state"],"title":"McpOauthCallbackRequestSchema","type":"object"},"McpOauthCallbackResponseSchema":{"description":"The finished connection and a live probe of what it can reach.","properties":{"server":{"$ref":"#/components/schemas/McpServerReadSchema"},"verify":{"$ref":"#/components/schemas/McpServerVerifyResponseSchema"}},"required":["server","verify"],"title":"McpOauthCallbackResponseSchema","type":"object"},"McpOauthConnectRequestSchema":{"description":"Which catalog entry to begin (or redo) an OAuth connection for.","properties":{"slug":{"maxLength":64,"minLength":1,"title":"Slug","type":"string"}},"required":["slug"],"title":"McpOauthConnectRequestSchema","type":"object"},"McpOauthConnectResponseSchema":{"description":"Where to send the user's browser to authorize the connection.","properties":{"authorize_url":{"title":"Authorize Url","type":"string"}},"required":["authorize_url"],"title":"McpOauthConnectResponseSchema","type":"object"},"McpServerCreateSchema":{"description":"A new MCP server's configuration.","properties":{"enabled":{"default":true,"title":"Enabled","type":"boolean"},"headers":{"additionalProperties":{"type":"string"},"description":"Request headers sent with every call, e.g. Authorization.","title":"Headers","type":"object"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"url":{"maxLength":2048,"minLength":1,"title":"Url","type":"string"}},"required":["name","url"],"title":"McpServerCreateSchema","type":"object"},"McpServerListResponseSchema":{"description":"The organisation's MCP servers, alphabetical.","properties":{"servers":{"items":{"$ref":"#/components/schemas/McpServerReadSchema"},"title":"Servers","type":"array"}},"required":["servers"],"title":"McpServerListResponseSchema","type":"object"},"McpServerReadSchema":{"description":"One org-level MCP server as the agent editor renders it.","properties":{"account_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth servers only: best-effort account/workspace name of the grant.","title":"Account Label"},"auth_mode":{"description":"How requests authenticate: 'headers' (static) or 'oauth'.","title":"Auth Mode","type":"string"},"catalog_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The curated-catalog entry this server came from; null for custom servers.","title":"Catalog Slug"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"enabled":{"title":"Enabled","type":"boolean"},"header_names":{"description":"The names of the configured request headers. Values are credentials and are never returned by the API.","items":{"type":"string"},"title":"Header Names","type":"array"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"oauth_status":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth servers only: 'active' or 'needs_reconnect'; null for static-header servers and never-connected rows.","title":"Oauth Status"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"url":{"title":"Url","type":"string"}},"required":["id","name","url","header_names","enabled","auth_mode","catalog_slug","oauth_status","account_label","created_at","updated_at"],"title":"McpServerReadSchema","type":"object"},"McpServerUpdateSchema":{"description":"A partial MCP server update; absent fields keep their value.","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"description":"When present, REPLACES the whole header dict. Values are never echoed back, so an edit re-enters every kept header.","title":"Headers"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"maxLength":2048,"minLength":1,"type":"string"},{"type":"null"}],"title":"Url"}},"title":"McpServerUpdateSchema","type":"object"},"McpServerVerifyResponseSchema":{"description":"A live probe's result; an unreachable server is data, not an error.","properties":{"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"ok":{"title":"Ok","type":"boolean"},"tools":{"items":{"$ref":"#/components/schemas/McpToolSchema"},"title":"Tools","type":"array"}},"required":["ok","error","tools"],"title":"McpServerVerifyResponseSchema","type":"object"},"McpToolSchema":{"description":"One tool a probed MCP server offers.","properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"input_schema":{"additionalProperties":true,"title":"Input Schema","type":"object"},"name":{"title":"Name","type":"string"}},"required":["name","description","input_schema"],"title":"McpToolSchema","type":"object"},"MessageClass":{"description":"What a message turned out to be; NULL on an ordinary message of ours.\n\nREPLY stops the cadence; BOUNCE (a DSN) marks the contact bounced and never\nlooks like a reply; OUT_OF_OFFICE never stops anything and defers the\ncadence to the stated return when one is parsed; AUTOMATED is a machine\nwriting back (a ticketing auto-ack, a mailing list, a no-reply robot), and\nlike OUT_OF_OFFICE it never stops a cadence, because nobody read the mail.\nThe first four are inbound. FORWARD is ours, outbound: a message of the\nthread passed on to somebody else (``service.forward_message``). Nothing\nwas said to the contact, so it is never an answer to them: it does not\nmove a conversation out of the Inbox, count as replied, or end a done mark.","enum":["reply","bounce","out_of_office","automated","forward"],"title":"MessageClass","type":"string"},"MessageConfidence":{"description":"The writer's own read on whether its message is ready to send unedited.","enum":["high","medium","low"],"title":"MessageConfidence","type":"string"},"MessageDirection":{"enum":["outbound","inbound"],"title":"MessageDirection","type":"string"},"MessageKind":{"description":"What one written message is, which decides its rules, its length and its channel.","enum":["email","linkedin_connection_note","linkedin_message","linkedin_inmail","reply_email","reply_linkedin"],"title":"MessageKind","type":"string"},"MessageListReadSchema":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/MessageReadSchema"},"title":"Messages","type":"array"}},"required":["messages"],"title":"MessageListReadSchema","type":"object"},"MessageOverridePutSchema":{"description":"Pin the exact message one contact receives. Null subject keeps in-thread.","properties":{"body":{"maxLength":50000,"minLength":1,"title":"Body","type":"string"},"subject":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Subject"}},"required":["body"],"title":"MessageOverridePutSchema","type":"object"},"MessageOverrideReadSchema":{"description":"One contact's hand-written message for one step.","properties":{"body":{"title":"Body","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"step_id":{"format":"uuid","title":"Step Id","type":"string"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["step_id","record_id","subject","body","updated_at"],"title":"MessageOverrideReadSchema","type":"object"},"MessagePerformanceReadSchema":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/StepPerformanceReadSchema"},"title":"Rows","type":"array"}},"required":["rows"],"title":"MessagePerformanceReadSchema","type":"object"},"MessageReadSchema":{"properties":{"attachments":{"items":{"$ref":"#/components/schemas/AttachmentReadSchema"},"title":"Attachments","type":"array"},"authentication_result":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The receiving mail server's verdict on whether a message really came from the sender's domain, by DMARC or SPF: `pass`, `fail`, `none` when the server gave no verdict, or `unknown` when its verdict was neither. The agent only answers an email on its own when it passed. Null when no verdict was recorded, such as on LinkedIn messages and on messages sent from Oneprofile.","title":"Authentication Result"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The sender's raw HTML part; sanitise before rendering.","title":"Body Html"},"body_text":{"title":"Body Text","type":"string"},"bounce_severity":{"anyOf":[{"$ref":"#/components/schemas/BounceSeverity"},{"type":"null"}]},"channel":{"$ref":"#/components/schemas/InboxChannel","description":"This message's own channel. Threads merge channels, so the reader captions each message by what it actually is: a LinkedIn DM involves no email addresses."},"direction":{"$ref":"#/components/schemas/MessageDirection"},"files_pending":{"description":"True while the files this email came with are still being read from the mailbox, so `attachments` may not list them yet: it fills in once they are read, and the conversation updates on its own when that happens. False on every other message, including one whose files are already listed and one that came with none.","title":"Files Pending","type":"boolean"},"from_address":{"title":"From Address","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"mailbox_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Mailbox Id"},"message_class":{"anyOf":[{"$ref":"#/components/schemas/MessageClass"},{"type":"null"}]},"send_state":{"$ref":"#/components/schemas/MessageSendState"},"sent_at":{"format":"date-time","title":"Sent At","type":"string"},"sent_by_kind":{"anyOf":[{"$ref":"#/components/schemas/MessageSentByKind"},{"type":"null"}],"description":"Who sent an outbound message: `person` when someone in your workspace wrote or approved it, `system` when the agent sent it on its own with nobody approving it. Null on messages you received, and on outbound messages where this was not recorded, such as sequence steps and mail sent straight from the mailbox."},"sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The sequence this message was sent from, when it came from one.","title":"Sequence Id"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Which step sent this message, carried per-message (not just on the thread) because a contact re-enrolled in a different sequence keeps their earlier messages' own sequence/step, distinct from the thread's current one.","title":"Step Id"},"subject":{"title":"Subject","type":"string"},"thread_id":{"format":"uuid","title":"Thread Id","type":"string"},"to_address":{"title":"To Address","type":"string"}},"required":["id","thread_id","mailbox_id","channel","direction","send_state","from_address","to_address","subject","body_text","sent_at","message_class","bounce_severity","attachments","files_pending"],"title":"MessageReadSchema","type":"object"},"MessageSendState":{"description":"Whether a message has actually left.\n\nOnly meaningful on LinkedIn. An email row is written after the provider\naccepted it, so it is ``SENT`` the moment it exists; a LinkedIn reply is\nwritten when it is QUEUED, and cannot become ``SENT`` until the customer's\nown browser has delivered it. Showing the two the same way would have the\nproduct assert a delivery it has no evidence for.","enum":["sent","queued","failed"],"title":"MessageSendState","type":"string"},"MessageSentByKind":{"description":"Who composed an outbound message: a person, or the product itself.\n\nOnly meaningful outbound, and NULL on anything inbound. The distinction\nexists because an agent-written reply has to stay attributable after the\nfact: \"did a human send this\" is the first question asked of any send that\nturns out to have been wrong, and a column is the only place that answer\nsurvives.","enum":["person","system"],"title":"MessageSentByKind","type":"string"},"MessageStatus":{"description":"Where one written message stands.\n\nWRITING is a lease: the model is being asked. WRITTEN, QUEUED (a person is\nlooking at it) and EDITED (a person changed it) are the three sendable\nstates. UNPAID is written but not fully charged, so it is not sendable\nuntil the remainder is collected. SENT, REJECTED, SUPERSEDED and FAILED are\nterminal.","enum":["writing","written","unpaid","queued","sent","edited","rejected","superseded","failed"],"title":"MessageStatus","type":"string"},"MessageTemplateCreateSchema":{"properties":{"body_segments":{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"title":"Body Segments","type":"array"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"scope":{"$ref":"#/components/schemas/TemplateScope","default":"sequence_step","description":"The composer this template is being saved from."},"subject_segments":{"anyOf":[{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"type":"array"},{"type":"null"}],"title":"Subject Segments"}},"required":["name"],"title":"MessageTemplateCreateSchema","type":"object"},"MessageTemplateListReadSchema":{"properties":{"built_in":{"description":"The templates we ship, the same in every workspace, for a sequence's email steps only.","items":{"$ref":"#/components/schemas/BuiltInMessageTemplateReadSchema"},"title":"Built In","type":"array"},"templates":{"items":{"$ref":"#/components/schemas/MessageTemplateReadSchema"},"title":"Templates","type":"array"}},"required":["templates"],"title":"MessageTemplateListReadSchema","type":"object"},"MessageTemplateReadSchema":{"description":"One saved template, as segments so variables survive reuse.","properties":{"body_segments":{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"title":"Body Segments","type":"array"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"created_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The person who saved it, whom the library names beside it. Null for a template saved before anyone was recorded.","title":"Created By User Id"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"scope":{"$ref":"#/components/schemas/TemplateScope","description":"Which composer this template belongs to. The picker filters to the surface it was opened from."},"subject_segments":{"anyOf":[{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"type":"array"},{"type":"null"}],"title":"Subject Segments"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","scope","subject_segments","body_segments","created_at","updated_at"],"title":"MessageTemplateReadSchema","type":"object"},"MessageTemplateUpdateSchema":{"description":"Rename and/or re-scope; absent fields stay untouched.","properties":{"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"title":"Name"},"scope":{"anyOf":[{"$ref":"#/components/schemas/TemplateScope"},{"type":"null"}]}},"title":"MessageTemplateUpdateSchema","type":"object"},"MissingEmailsEstimateReadSchema":{"description":"What finding the audience's missing work emails would cover and cost, before it runs.","properties":{"adds_column":{"description":"True when that column does not exist yet and finding adds it to the audience table first. Adding it costs nothing.","title":"Adds Column","type":"boolean"},"balance_sufficient":{"description":"Whether the workspace's available credits cover the most it could cost.","title":"Balance Sufficient","type":"boolean"},"column_name":{"description":"The Find work email column the addresses land in, by its name on the table.","title":"Column Name","type":"string"},"estimated_credits":{"description":"The most it could cost, in credits: every row priced in full.","title":"Estimated Credits","type":"number"},"expected_credits":{"description":"What it usually costs, in credits: each row is charged the price of the source that answered it, read from which sources usually answer. Quote it beside estimated_credits, never instead of it: up to estimated_credits, usually about this. When the two are equal the lookup has one price: then quote that one figure, without up to.","title":"Expected Credits","type":"number"},"rows":{"description":"Contacts it would look up: audience rows with no email that a Find work email lookup has not tried yet. The same number the launch check's `contacts_missing_email` finding carries in `count`.","title":"Rows","type":"integer"},"scope_too_large":{"description":"True when more contacts are missing an email than one run may cover. Narrow the audience's view first; running is refused until then.","title":"Scope Too Large","type":"boolean"}},"required":["rows","expected_credits","estimated_credits","balance_sufficient","scope_too_large","column_name","adds_column"],"title":"MissingEmailsEstimateReadSchema","type":"object"},"MissingEmailsFindReadSchema":{"description":"The run that is now finding the audience's missing work emails.","properties":{"column_id":{"description":"The Find work email column the run fills in.","format":"uuid","title":"Column Id","type":"string"},"column_name":{"description":"That column's name on the table.","title":"Column Name","type":"string"},"rows":{"description":"Contacts the run is looking up.","title":"Rows","type":"integer"},"run":{"anyOf":[{"$ref":"#/components/schemas/TableRunReadSchema"},{"type":"null"}],"description":"The run, or null while its start is still queued; the table's active runs pick it up either way."},"table_id":{"description":"The sequence's audience table.","format":"uuid","title":"Table Id","type":"string"}},"required":["rows","table_id","column_id","column_name","run"],"title":"MissingEmailsFindReadSchema","type":"object"},"MoveContactRequestSchema":{"description":"Where Move to another sequence should put the contact.","properties":{"target_sequence_id":{"description":"The sequence to move the contact to. It must send to the same table.","format":"uuid","title":"Target Sequence Id","type":"string"}},"required":["target_sequence_id"],"title":"MoveContactRequestSchema","type":"object"},"MultiSelectOptions":{"description":"Options for a multi-select column.","properties":{"choices":{"items":{"$ref":"#/components/schemas/SelectChoice"},"title":"Choices","type":"array"},"type":{"const":"multi_select","default":"multi_select","title":"Type","type":"string"}},"title":"MultiSelectOptions","type":"object"},"NextStepKind":{"description":"What a next step offered under a reply is about, which decides the icon it wears.\n\nEach kind wears the icon that thing wears on its own page; ``other`` wears\nthe Chat page's speech bubble.","enum":["business_context","email","phone","sequence","agent","table","search","inbox","mailbox","other"],"title":"NextStepKind","type":"string"},"NodeFunnelReadSchema":{"description":"One step's badge: how many wait here, went through, and failed.","properties":{"awaiting_answer":{"default":0,"description":"On a connection request: contacts whose request went out and whose answer is not in yet, those it already finished included until their answer is recorded. Zero on every other step.","title":"Awaiting Answer","type":"integer"},"executed":{"title":"Executed","type":"integer"},"failed":{"title":"Failed","type":"integer"},"step_id":{"format":"uuid","title":"Step Id","type":"string"},"waiting":{"title":"Waiting","type":"integer"}},"required":["step_id","waiting","executed","failed"],"title":"NodeFunnelReadSchema","type":"object"},"NotAddedReason":{"description":"Why people an import found are not all rows in the table.\n\n``found_twice``: a new table, where the index held the same person under\ntwo records (one profile, two ids), so the second copy found the first.\n``already_in_table``: an import into a table that already had rows, where a\nperson found was already one of them (and so was refreshed, not added).","enum":["found_twice","already_in_table"],"title":"NotAddedReason","type":"string"},"NotFoundResponse":{"properties":{"detail":{"description":"The detail of why the resource was not found.","title":"Detail","type":"string"}},"required":["detail"],"title":"NotFoundResponse","type":"object"},"NotificationChannel":{"description":"Where a notification goes. Slack is a shared channel; email is one person.","enum":["slack","email"],"title":"NotificationChannel","type":"string"},"NotificationKind":{"description":"Everything the product can tell a human about.\n\nTHREAD_LABELED is the only kind that carries a label. The rest\nare workspace events with no label dimension, which is why the rule table\nconstrains ``label_id`` to exactly this kind.\n\nThe three credit kinds are stored separately even though the settings UI\noffers one \"credit alerts\" switch: they crossed three different thresholds\nand keeping them apart means splitting the switch later is a UI change, not\na migration.\n\nThe ``affiliate_*`` kinds are program mail to the enrolled affiliate's\ncontact address, not workspace-member fan-out: they carry no preference\nswitch, and the settings grid on the dashboard skips them by prefix.\n\nSEARCH_MATCHES_WAITING: a scheduled lead search no longer buys\nits rows, so when it fires and finds new matches the buy waits on a person\nas a proposal, and this is how they hear about it.","enum":["new_reply","thread_labeled","mailbox_disconnected","low_credits","credits_exhausted","work_paused","draft_awaiting_approval","linkedin_checkpoint","linkedin_browser_offline","search_matches_waiting","reply_sent_by_agent","agent_sending_paused","contact_asked_to_stop","affiliate_welcome","affiliate_referral_signed_up","affiliate_referral_converted","affiliate_statement","affiliate_payout_sent","affiliate_action_needed","affiliate_balance_forfeited"],"title":"NotificationKind","type":"string"},"NotificationPreferenceSchema":{"properties":{"email_enabled":{"title":"Email Enabled","type":"boolean"},"notification_kind":{"$ref":"#/components/schemas/NotificationKind"}},"required":["notification_kind","email_enabled"],"title":"NotificationPreferenceSchema","type":"object"},"NotificationPreferencesPutSchema":{"properties":{"preferences":{"items":{"$ref":"#/components/schemas/NotificationPreferenceSchema"},"maxItems":20,"title":"Preferences","type":"array"}},"required":["preferences"],"title":"NotificationPreferencesPutSchema","type":"object"},"NotificationRuleCreateSchema":{"properties":{"channel":{"$ref":"#/components/schemas/NotificationChannel"},"label_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Label Id"},"notify_user_id":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Notify User Id"},"slack_channel_id":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"title":"Slack Channel Id"},"trigger_kind":{"$ref":"#/components/schemas/NotificationKind"}},"required":["trigger_kind","channel"],"title":"NotificationRuleCreateSchema","type":"object"},"NotificationRuleReadSchema":{"properties":{"channel":{"$ref":"#/components/schemas/NotificationChannel"},"id":{"format":"uuid","title":"Id","type":"string"},"is_active":{"title":"Is Active","type":"boolean"},"label_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Label Id"},"notify_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notify User Id"},"slack_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Channel Id"},"slack_channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Channel Name"},"trigger_kind":{"$ref":"#/components/schemas/NotificationKind"}},"required":["id","trigger_kind","label_id","channel","slack_channel_id","slack_channel_name","notify_user_id","is_active"],"title":"NotificationRuleReadSchema","type":"object"},"OnboardingItemReadSchema":{"properties":{"completed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Completed At"},"id":{"format":"uuid","title":"Id","type":"string"},"sort_order":{"title":"Sort Order","type":"integer"},"step_key":{"$ref":"#/components/schemas/OnboardingStepKey"}},"required":["id","step_key","sort_order","completed_at"],"title":"OnboardingItemReadSchema","type":"object"},"OnboardingReadSchema":{"properties":{"completed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the last step was completed; null while any step is pending.","title":"Completed At"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"dismissed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When someone hid the checklist for the workspace; null while it shows.","title":"Dismissed At"},"id":{"format":"uuid","title":"Id","type":"string"},"items":{"description":"The steps, in checklist order.","items":{"$ref":"#/components/schemas/OnboardingItemReadSchema"},"title":"Items","type":"array"},"targets":{"$ref":"#/components/schemas/OnboardingTargetsReadSchema"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","completed_at","dismissed_at","items","targets","created_at","updated_at"],"title":"OnboardingReadSchema","type":"object"},"OnboardingStepKey":{"description":"The six steps a new workspace is walked through, named by outcome.\n\nStored as a plain string column, so a seventh step is a new member here\nplus a row the next read seeds: no enum migration, no backfill.","enum":["find_leads","add_enrichment","add_ai_column","connect_mailbox","connect_linkedin","launch_sequence"],"title":"OnboardingStepKey","type":"string"},"OnboardingTargetsReadSchema":{"description":"Where the pending steps deep-link; every field is null once the checklist is done.","properties":{"draft_sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A draft sequence waiting to be launched; null when there is none.","title":"Draft Sequence Id"},"latest_table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The newest table, for the add-column steps; null when there is none yet.","title":"Latest Table Id"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The sender whose LinkedIn tab the connect step opens: one that already sends email when there is one; null when the workspace has no sender.","title":"Sender Profile Id"}},"required":["latest_table_id","sender_profile_id","draft_sequence_id"],"title":"OnboardingTargetsReadSchema","type":"object"},"OrderingParametersForCheckedAt":{"enum":["checked_at"],"title":"OrderingParametersForCheckedAt","type":"string"},"OrderingParametersForCreatedAt":{"enum":["created_at"],"title":"OrderingParametersForCreatedAt","type":"string"},"OrderingParametersForCreatedAtContactLabel":{"enum":["created_at","contact_label"],"title":"OrderingParametersForCreatedAtContactLabel","type":"string"},"OrderingParametersForDeletedAtName":{"enum":["deleted_at","name"],"title":"OrderingParametersForDeletedAtName","type":"string"},"OrderingParametersForIdCreatedAt":{"enum":["id","created_at"],"title":"OrderingParametersForIdCreatedAt","type":"string"},"OrderingParametersForIdCreatedAtStartedAt":{"enum":["id","created_at","started_at"],"title":"OrderingParametersForIdCreatedAtStartedAt","type":"string"},"OrderingParametersForIdCreatedAtUpdatedAt":{"enum":["id","created_at","updated_at"],"title":"OrderingParametersForIdCreatedAtUpdatedAt","type":"string"},"OrderingParametersForIdCreatedAtUpdatedAtName":{"enum":["id","created_at","updated_at","name"],"title":"OrderingParametersForIdCreatedAtUpdatedAtName","type":"string"},"OrderingParametersForIdCreatedAtUpdatedAtNameCreatedByDisplayName":{"enum":["id","created_at","updated_at","name","created_by_display_name"],"title":"OrderingParametersForIdCreatedAtUpdatedAtNameCreatedByDisplayName","type":"string"},"OrderingParametersForIdCreatedAtUpdatedAtNameOwnerUserId":{"enum":["id","created_at","updated_at","name","owner_user_id"],"title":"OrderingParametersForIdCreatedAtUpdatedAtNameOwnerUserId","type":"string"},"OrderingParametersForIdOccurredAtCreatedAt":{"enum":["id","occurred_at","created_at"],"title":"OrderingParametersForIdOccurredAtCreatedAt","type":"string"},"OrderingParametersForIdOccurredAtCreatedAtUpdatedAt":{"enum":["id","occurred_at","created_at","updated_at"],"title":"OrderingParametersForIdOccurredAtCreatedAtUpdatedAt","type":"string"},"OrderingParametersForIdSignedUpAtCreatedAt":{"enum":["id","signed_up_at","created_at"],"title":"OrderingParametersForIdSignedUpAtCreatedAt","type":"string"},"OrderingParametersForOccurredAtContactLabel":{"enum":["occurred_at","contact_label"],"title":"OrderingParametersForOccurredAtContactLabel","type":"string"},"OutboundAgentConfig":{"additionalProperties":false,"description":"The versioned configuration one outbound agent carries, stored as JSON on its row.\n\nEverything a person sets on the Agent tab that is not already a column of\nthe saved-agent row (``model_key`` and the research switch live there).\n``message_prompts`` is keyed by an opaque slot key the caller mints (the\nstep id); the agent never learns what a slot means.","properties":{"campaign":{"anyOf":[{"$ref":"#/components/schemas/CampaignBrief"},{"type":"null"}]},"cta_label":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"title":"Cta Label"},"cta_url":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Cta Url"},"goal":{"default":"","maxLength":1000,"title":"Goal","type":"string"},"language":{"default":"English","maxLength":16,"title":"Language","type":"string"},"message_prompts":{"additionalProperties":{"maxLength":4000,"type":"string"},"maxProperties":50,"propertyNames":{"maxLength":64},"title":"Message Prompts","type":"object"},"person_research":{"default":false,"title":"Person Research","type":"boolean"},"personality_preset":{"$ref":"#/components/schemas/PersonalityPreset","default":"direct"},"personality_prompt":{"default":"","maxLength":4000,"title":"Personality Prompt","type":"string"},"reply_drafting":{"default":true,"title":"Reply Drafting","type":"boolean"},"reply_prompt":{"default":"","maxLength":4000,"title":"Reply Prompt","type":"string"},"translate":{"default":false,"title":"Translate","type":"boolean"},"write_from_excluded_column_ids":{"items":{"maxLength":64,"type":"string"},"maxItems":200,"title":"Write From Excluded Column Ids","type":"array"}},"title":"OutboundAgentConfig","type":"object"},"OutboundAgentReadSchema":{"description":"One sequence's outbound agent: what it writes with, and how.","properties":{"column_names":{"additionalProperties":{"type":"string"},"description":"The audience column each column id in the configuration is, by name: the columns the goal and the prompts point at with /, and the ones taken out of Write from. Filled on a read; a column that is gone is missing from it.","title":"Column Names","type":"object"},"config":{"$ref":"#/components/schemas/OutboundAgentConfig"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"model_key":{"title":"Model Key","type":"string"},"name":{"title":"Name","type":"string"},"research":{"title":"Research","type":"boolean"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"version":{"title":"Version","type":"integer"}},"required":["id","name","version","model_key","research","config","created_at","updated_at"],"title":"OutboundAgentReadSchema","type":"object"},"OutboundAgentUpdateSchema":{"description":"A change to an agent, sent whole against the version it was read at.\n\nThe configuration travels as one object rather than as fifteen optional\nfields: the AI writing tab reads the agent, edits it and sends it back, and\n``expected_version`` makes two people editing at once a 409 rather than a\nsilent overwrite.","properties":{"config":{"anyOf":[{"$ref":"#/components/schemas/OutboundAgentConfig"},{"type":"null"}],"description":"The whole configuration; omitted leaves it as it is. Its `campaign` is ignored: the campaign is written by tailoring alone."},"expected_version":{"description":"The version the editor was opened at.","minimum":1.0,"title":"Expected Version","type":"integer"},"model_key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The model it writes with: swift, core or deep.","title":"Model Key"},"research":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the first message may research the person on the web.","title":"Research"}},"required":["expected_version"],"title":"OutboundAgentUpdateSchema","type":"object"},"OutboundAgentVersionReadSchema":{"description":"One entry of an agent's version history.","properties":{"changed_fields":{"items":{"type":"string"},"title":"Changed Fields","type":"array"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"created_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By User Id"},"source":{"title":"Source","type":"string"},"version":{"title":"Version","type":"integer"}},"required":["version","source","created_by_user_id","created_at"],"title":"OutboundAgentVersionReadSchema","type":"object"},"OutboundCampaignReadSchema":{"description":"One tested campaign from the library tailoring chooses between.","properties":{"featured":{"default":false,"description":"Shown as a card on the Sequences page; the rest are in the gallery.","title":"Featured","type":"boolean"},"icon":{"description":"The Lucide token its row wears in the campaign gallery.","title":"Icon","type":"string"},"key":{"title":"Key","type":"string"},"name":{"title":"Name","type":"string"},"requires":{"description":"What it cannot run without: `proof_points` (written in the business context), `linkedin` (LinkedIn profiles and a sender on LinkedIn) or `intent` (the person's own words on what it is for).","items":{"type":"string"},"title":"Requires","type":"array"},"retired":{"default":false,"description":"No longer chosen; listed so a sequence that runs it still reads right.","title":"Retired","type":"boolean"},"steps":{"items":{"$ref":"#/components/schemas/OutboundCampaignStepReadSchema"},"title":"Steps","type":"array"},"summary":{"title":"Summary","type":"string"},"tagline":{"description":"The summary in a few words, for a card's two lines.","title":"Tagline","type":"string"}},"required":["key","name","summary","tagline","icon","steps"],"title":"OutboundCampaignReadSchema","type":"object"},"OutboundCampaignStepReadSchema":{"description":"One step of a library campaign.","properties":{"arm":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`connected` or `not_accepted`: the answer to the campaign's connection request this step waits for. Null before the request, and on a step laid out on both branches.","title":"Arm"},"kind":{"description":"`email`, `linkedin_connection` or `linkedin_withdraw`.","title":"Kind","type":"string"},"prompt":{"description":"The instruction the step's message is written from; empty on a withdraw.","title":"Prompt","type":"string"},"title":{"description":"What the step's card is called.","title":"Title","type":"string"},"wait_days":{"description":"Days to wait before this step; 0 on the first.","title":"Wait Days","type":"integer"},"window_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"On a connection request: how many days it waits for an answer before the contact goes down Not accepted. Null on every other step.","title":"Window Days"}},"required":["kind","title","wait_days","prompt"],"title":"OutboundCampaignStepReadSchema","type":"object"},"OutboundConversationReadSchema":{"description":"One contact's running conversation with the agent, and what it has written.","properties":{"company_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Key"},"id":{"format":"uuid","title":"Id","type":"string"},"last_turn_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Turn At"},"messages":{"items":{"$ref":"#/components/schemas/OutboundMessageReadSchema"},"title":"Messages","type":"array"},"profile":{"anyOf":[{"$ref":"#/components/schemas/OutboundProfileReadSchema"},{"type":"null"}],"description":"The contact's LinkedIn profile as person research kept it, when it read one."},"profile_read_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the profile was read; null until an opener read one.","title":"Profile Read At"},"research_brief":{"items":{"$ref":"#/components/schemas/OutboundResearchFactReadSchema"},"title":"Research Brief","type":"array"},"researched_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Researched At"},"sources":{"items":{"type":"string"},"title":"Sources","type":"array"},"subject_key":{"title":"Subject Key","type":"string"}},"required":["id","subject_key","company_key","research_brief","sources","researched_at","last_turn_at","messages"],"title":"OutboundConversationReadSchema","type":"object"},"OutboundFeedbackCreateSchema":{"description":"A thumb, a note, or both, on one message the agent wrote.","properties":{"body":{"default":"","description":"The words rated, when the message they were on is gone.","maxLength":20000,"title":"Body","type":"string"},"comment":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"description":"What the person wants changed.","title":"Comment"},"create_only":{"default":false,"description":"Refuse to replace an existing verdict that was not reviewed.","title":"Create Only","type":"boolean"},"edited_body":{"anyOf":[{"maxLength":20000,"minLength":1,"type":"string"},{"type":"null"}],"title":"Edited Body"},"edited_subject":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"title":"Edited Subject"},"kind":{"$ref":"#/components/schemas/MessageKind","default":"email","description":"What the message was; read from the message itself when one is named."},"message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The message being rated; null when it is already gone.","title":"Message Id"},"rating":{"anyOf":[{"$ref":"#/components/schemas/FeedbackRating"},{"type":"null"}],"description":"The thumb."},"source":{"default":"agent_tab","description":"Where the verdict was given: a sequence's AI writing tab and training (`agent_tab`), or a task waiting for approval (`approval_card`). Only a verdict given on the AI writing tab counts as a check of that step's writing.","enum":["agent_tab","approval_card"],"title":"Source","type":"string"}},"title":"OutboundFeedbackCreateSchema","type":"object"},"OutboundFeedbackReadSchema":{"description":"One person's verdict on one message the agent wrote.","properties":{"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"consumed_in_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Consumed In Version"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"edited_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edited Body"},"edited_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edited Subject"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"$ref":"#/components/schemas/MessageKind"},"message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Message Id"},"original_body":{"title":"Original Body","type":"string"},"original_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Subject"},"rating":{"anyOf":[{"$ref":"#/components/schemas/FeedbackRating"},{"type":"null"}]},"slot_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slot Key"},"source":{"$ref":"#/components/schemas/FeedbackSource"},"teaches":{"description":"Whether the writer and a prompt rewrite learn from it: a Needs work, a note given without a Looks good, or a rewrite. A Looks good with no rewrite, a note on it and an approval kept as approved as written included, is a record and never teaches.","title":"Teaches","type":"boolean"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"user_id":{"title":"User Id","type":"string"}},"required":["id","message_id","kind","slot_key","user_id","rating","comment","original_subject","original_body","edited_subject","edited_body","source","consumed_in_version","teaches","created_at","updated_at"],"title":"OutboundFeedbackReadSchema","type":"object"},"OutboundFeedbackUpdateSchema":{"description":"The complete replacement verdict, tied to the feedback the author reviewed.","properties":{"comment":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Comment"},"edited_body":{"anyOf":[{"maxLength":20000,"minLength":1,"type":"string"},{"type":"null"}],"title":"Edited Body"},"edited_subject":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"title":"Edited Subject"},"expected_updated_at":{"format":"date-time","title":"Expected Updated At","type":"string"},"rating":{"anyOf":[{"$ref":"#/components/schemas/FeedbackRating"},{"type":"null"}]}},"required":["expected_updated_at","rating","comment","edited_subject","edited_body"],"title":"OutboundFeedbackUpdateSchema","type":"object"},"OutboundFindingReadSchema":{"description":"One thing a check said about a written message.","properties":{"code":{"title":"Code","type":"string"},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt"},"message":{"title":"Message","type":"string"},"severity":{"title":"Severity","type":"string"}},"required":["code","severity","message","excerpt"],"title":"OutboundFindingReadSchema","type":"object"},"OutboundJudgeVerdictReadSchema":{"description":"What the independent judge said about a written message.","properties":{"grounded":{"title":"Grounded","type":"boolean"},"language_ok":{"title":"Language Ok","type":"boolean"},"on_topic":{"title":"On Topic","type":"boolean"},"quality_score":{"title":"Quality Score","type":"integer"},"reasons":{"items":{"type":"string"},"title":"Reasons","type":"array"},"safe":{"title":"Safe","type":"boolean"}},"required":["grounded","safe","on_topic","language_ok","quality_score","reasons"],"title":"OutboundJudgeVerdictReadSchema","type":"object"},"OutboundMessageEditSchema":{"description":"A person's replacement words for one written message.","properties":{"body":{"description":"The body that sends.","maxLength":20000,"minLength":1,"title":"Body","type":"string"},"subject":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"description":"The subject; null threads the message under the last one.","title":"Subject"}},"required":["body"],"title":"OutboundMessageEditSchema","type":"object"},"OutboundMessageReadSchema":{"description":"One message the agent wrote, with everything shown beside it.","properties":{"agent_version":{"title":"Agent Version","type":"integer"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle"},"body":{"title":"Body","type":"string"},"confidence":{"anyOf":[{"$ref":"#/components/schemas/MessageConfidence"},{"type":"null"}]},"confidence_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence Score"},"confident":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Confident"},"conversation_id":{"format":"uuid","title":"Conversation Id","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"credits_charged":{"title":"Credits Charged","type":"integer"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"facts_used":{"items":{"type":"string"},"title":"Facts Used","type":"array"},"findings":{"items":{"$ref":"#/components/schemas/OutboundFindingReadSchema"},"title":"Findings","type":"array"},"generated_body":{"title":"Generated Body","type":"string"},"generated_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Subject"},"id":{"format":"uuid","title":"Id","type":"string"},"insufficient_data":{"title":"Insufficient Data","type":"boolean"},"is_preview":{"title":"Is Preview","type":"boolean"},"judge_verdict":{"anyOf":[{"$ref":"#/components/schemas/OutboundJudgeVerdictReadSchema"},{"type":"null"}]},"kind":{"$ref":"#/components/schemas/MessageKind"},"model_key":{"title":"Model Key","type":"string"},"opens_thread":{"title":"Opens Thread","type":"boolean"},"price_tenths":{"title":"Price Tenths","type":"integer"},"profile_read":{"default":false,"description":"Whether the agent read the contact's LinkedIn profile for this message.","title":"Profile Read","type":"boolean"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"reach":{"$ref":"#/components/schemas/AgentReach"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"sent_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Sent At"},"slot_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slot Key"},"status":{"$ref":"#/components/schemas/MessageStatus"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},"required":["id","conversation_id","kind","slot_key","opens_thread","subject","body","generated_subject","generated_body","confidence","confidence_score","quality_score","confident","reasoning","insufficient_data","findings","judge_verdict","facts_used","angle","model_key","reach","price_tenths","credits_charged","status","error","is_preview","agent_version","sent_at","created_at"],"title":"OutboundMessageReadSchema","type":"object"},"OutboundMessageRegenerateReadSchema":{"description":"What asking the agent to write a message again set in motion.","properties":{"draft_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"For a reply, the new draft now waiting for approval in the inbox. Null for a cadence message, and null for a reply when the agent found nothing it could usefully say.","title":"Draft Id"},"kind":{"$ref":"#/components/schemas/MessageKind","description":"What the message is. A message in the sequence's cadence is rewritten in the background and appears on the contact's conversation once written; a reply is rewritten straight away as a new draft in the inbox."},"message_id":{"description":"The message the agent was asked to write again.","format":"uuid","title":"Message Id","type":"string"}},"required":["message_id","kind","draft_id"],"title":"OutboundMessageRegenerateReadSchema","type":"object"},"OutboundMessageRegenerateSchema":{"description":"What to change when the agent writes a message again.","properties":{"from_task":{"default":false,"description":"True when the ask comes from the message's own task in the approval queue. That task reads Writing again while the agent writes the message again, then comes back waiting for a person; without it, a message waiting for approval is refused.","title":"From Task","type":"boolean"},"steer_text":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{"type":"null"}],"description":"A note on what to do differently, such as 'shorter' or 'open on their new funding round'. Leave it out to have the agent simply try again; a reply keeps the note its last draft was written with.","title":"Steer Text"}},"title":"OutboundMessageRegenerateSchema","type":"object"},"OutboundPersonalityReadSchema":{"description":"One built-in personality the agent can write in.","properties":{"key":{"$ref":"#/components/schemas/PersonalityPreset"},"label":{"title":"Label","type":"string"},"prompt":{"title":"Prompt","type":"string"},"summary":{"title":"Summary","type":"string"}},"required":["key","label","summary","prompt"],"title":"OutboundPersonalityReadSchema","type":"object"},"OutboundPresetsReadSchema":{"description":"Everything the AI writing tab needs that is not the agent itself.","properties":{"campaigns":{"description":"The campaign library: tested campaigns tailoring picks from for a sequence's audience, each with its steps and their instructions.","items":{"$ref":"#/components/schemas/OutboundCampaignReadSchema"},"title":"Campaigns","type":"array"},"default_config":{"$ref":"#/components/schemas/OutboundAgentConfig"},"default_email_prompts":{"items":{"type":"string"},"title":"Default Email Prompts","type":"array"},"default_linkedin_prompts":{"additionalProperties":{"type":"string"},"title":"Default Linkedin Prompts","type":"object"},"default_reply_prompt":{"title":"Default Reply Prompt","type":"string"},"person_research_available":{"default":false,"description":"Whether person research can be switched on: the catalog offers the read.","title":"Person Research Available","type":"boolean"},"personalities":{"items":{"$ref":"#/components/schemas/OutboundPersonalityReadSchema"},"title":"Personalities","type":"array"},"prices":{"items":{"$ref":"#/components/schemas/OutboundPricePointReadSchema"},"title":"Prices","type":"array"}},"required":["personalities","prices","default_config","default_email_prompts","default_linkedin_prompts","default_reply_prompt"],"title":"OutboundPresetsReadSchema","type":"object"},"OutboundPricePointReadSchema":{"description":"What one model costs per message, in tenths of a credit.","properties":{"clock_seconds":{"title":"Clock Seconds","type":"number"},"display_name":{"title":"Display Name","type":"string"},"model_key":{"title":"Model Key","type":"string"},"no_web_tenths":{"title":"No Web Tenths","type":"integer"},"profile_tenths":{"description":"What reading a contact's LinkedIn profile adds to the first message on this model, in tenths of a credit; charged only when a profile was read.","title":"Profile Tenths","type":"integer"},"web_tenths":{"title":"Web Tenths","type":"integer"}},"required":["model_key","display_name","no_web_tenths","web_tenths","profile_tenths","clock_seconds"],"title":"OutboundPricePointReadSchema","type":"object"},"OutboundProfileReadSchema":{"description":"What person research kept of the contact's LinkedIn profile.","properties":{"about":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"About"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"education":{"items":{"type":"string"},"title":"Education","type":"array"},"followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Followers"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"profile_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Url"},"work_history":{"items":{"$ref":"#/components/schemas/OutboundProfileRoleReadSchema"},"title":"Work History","type":"array"}},"required":["headline","about","job_title","company_name","location","followers","work_history","education","profile_url"],"title":"OutboundProfileReadSchema","type":"object"},"OutboundProfileRoleReadSchema":{"description":"One role from the profile's work history.","properties":{"employer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employer"},"end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"},"start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"required":["title","employer","start","end"],"title":"OutboundProfileRoleReadSchema","type":"object"},"OutboundPromptProposalAcceptSchema":{"description":"Accept a proposal, writing the prompts as the agent's next version.","properties":{"base_version":{"description":"The version the proposal was written against.","minimum":1.0,"title":"Base Version","type":"integer"},"feedback_cutoff":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The proposal's read time; feedback edited later stays pending.","title":"Feedback Cutoff"},"feedback_ids":{"description":"The feedback the proposal read, stamped as consumed.","items":{"format":"uuid","type":"string"},"title":"Feedback Ids","type":"array"},"items":{"additionalProperties":{"maxLength":4000,"type":"string"},"description":"The accepted prompt per slot key; the reply prompt travels under 'reply'.","maxProperties":50,"propertyNames":{"maxLength":64},"title":"Items","type":"object"}},"required":["base_version","items"],"title":"OutboundPromptProposalAcceptSchema","type":"object"},"OutboundPromptProposalItemReadSchema":{"description":"One prompt the rewriter proposes to change.","properties":{"current":{"title":"Current","type":"string"},"feedback_ids":{"items":{"format":"uuid","type":"string"},"title":"Feedback Ids","type":"array"},"proposed":{"title":"Proposed","type":"string"},"rationale":{"title":"Rationale","type":"string"},"review":{"anyOf":[{"$ref":"#/components/schemas/ProposalReviewDTO"},{"type":"null"}]},"slot_key":{"title":"Slot Key","type":"string"}},"required":["slot_key","current","proposed","rationale"],"title":"OutboundPromptProposalItemReadSchema","type":"object"},"OutboundPromptProposalReadSchema":{"description":"A proposed rewrite of the agent's prompts, tied to the version it was written against.","properties":{"agent_id":{"format":"uuid","title":"Agent Id","type":"string"},"base_version":{"title":"Base Version","type":"integer"},"feedback_count":{"title":"Feedback Count","type":"integer"},"feedback_cutoff":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Feedback Cutoff"},"feedback_ids":{"items":{"format":"uuid","type":"string"},"title":"Feedback Ids","type":"array"},"items":{"items":{"$ref":"#/components/schemas/OutboundPromptProposalItemReadSchema"},"title":"Items","type":"array"}},"required":["agent_id","base_version","feedback_count","feedback_ids","items"],"title":"OutboundPromptProposalReadSchema","type":"object"},"OutboundPromptProposalRequestSchema":{"description":"Ask for a rewrite of the agent's prompts from its feedback.","properties":{"also_slots":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"Teach the same feedback to these prompts too, even though none was given on their messages. Feedback names the one message it was given on, so without this a note on the opener can only ever change the opener. Each prompt is still rewritten against its own wording.","title":"Also Slots"},"revision_request":{"default":"","description":"What to change about a proposal already seen.","maxLength":2000,"title":"Revision Request","type":"string"},"slot_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"Only rewrite these prompts; every prompt that has feedback when null.","title":"Slot Keys"}},"title":"OutboundPromptProposalRequestSchema","type":"object"},"OutboundResearchFactReadSchema":{"description":"One fact the research kept about the contact.","properties":{"category":{"$ref":"#/components/schemas/ResearchFactCategory"},"fact":{"title":"Fact","type":"string"},"source_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Title"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"required":["fact","category","source_url","source_title"],"title":"OutboundResearchFactReadSchema","type":"object"},"OutboundVersionChangesSchema":{"properties":{"changes":{"items":{"$ref":"#/components/schemas/OutboundWritingChangeSchema"},"title":"Changes","type":"array"},"compared_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Compared Version"},"current_version":{"title":"Current Version","type":"integer"},"version":{"title":"Version","type":"integer"}},"required":["version","compared_version","current_version","changes"],"title":"OutboundVersionChangesSchema","type":"object"},"OutboundWritingChangeSchema":{"properties":{"after":{"title":"After"},"before":{"title":"Before"},"field":{"title":"Field","type":"string"},"label":{"title":"Label","type":"string"}},"required":["field","label"],"title":"OutboundWritingChangeSchema","type":"object"},"OutreachActivityChangedEventSchema":{"description":"A sender's Activity gained a row; refetch that sender's Activity.\n\n``sender_profile_id`` None means more than one sender's did in the same\ntransaction.","properties":{"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sender Profile Id"}},"title":"OutreachActivityChangedEventSchema","type":"object"},"OutreachActivityCountSchema":{"description":"How many Activity rows the same filters select, for the page's total.","properties":{"total":{"description":"How many rows match the filters.","title":"Total","type":"integer"}},"required":["total"],"title":"OutreachActivityCountSchema","type":"object"},"OutreachActivityEmailReadSchema":{"description":"The email one row of a sender's activity sent, exactly as it left.","properties":{"email_html":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The email's HTML part exactly as it was handed to Gmail: the words, the signature and the opt-out footer, every line and space as the contact got them. Null for a LinkedIn row, or a send from before the send kept its email.","title":"Email Html"}},"required":["email_html"],"title":"OutreachActivityEmailReadSchema","type":"object"},"OutreachActivityReadSchema":{"description":"One email or LinkedIn step that went out as a sender, or a task a person refused.","properties":{"acted_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a LinkedIn step acted on LinkedIn. Set on a step marked failed means it went through after all, after it was marked failed.","title":"Acted At"},"agent_written":{"description":"Whether the outbound agent wrote the words.","title":"Agent Written","type":"boolean"},"ask_reason":{"anyOf":[{"$ref":"#/components/schemas/AskReason"},{"type":"null"}],"description":"Why it was held for a person before it went; null when it was not held."},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The words as they went out, or would have for a refusal.","title":"Body"},"channel":{"$ref":"#/components/schemas/TaskChannel"},"contact_company":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact's company, from their audience row.","title":"Contact Company"},"contact_identity":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The address or LinkedIn profile behind the label.","title":"Contact Identity"},"contact_label":{"description":"The contact as the queue names them: a name, else an address or profile.","title":"Contact Label","type":"string"},"contact_title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact's job title, from their audience row.","title":"Contact Title"},"decided_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Decided At"},"decided_by_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who approved it, refused it or sent it: a person's name, an API key's, or the platform's. Null when nobody did.","title":"Decided By Display Name"},"decision":{"$ref":"#/components/schemas/ActivityDecision"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why it failed, in the channel's words, or why the person refused it.","title":"Detail"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The LinkedIn step's error code, or for a skip its specific reason, for the words every LinkedIn surface gives it.","title":"Error Code"},"found_already":{"default":false,"description":"A step that was cut off, came back, and found its own earlier attempt had already done it.","title":"Found Already","type":"boolean"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"description":"The LinkedIn action slug, or `email` (a sequence's email) or `reply`.","title":"Kind","type":"string"},"linkedin_action_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Linkedin Action Id"},"mailbox_address":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The address an email left from; null for LinkedIn.","title":"Mailbox Address"},"mailbox_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Mailbox Id"},"occurred_at":{"description":"When it was sent, when the LinkedIn step ended, or when it was refused.","format":"date-time","title":"Occurred At","type":"string"},"outcome":{"$ref":"#/components/schemas/ActivityOutcome"},"sender_profile_id":{"format":"uuid","title":"Sender Profile Id","type":"string"},"sender_profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The sender it went out as; null when the sender was since deleted.","title":"Sender Profile Name"},"sent_without_note":{"default":false,"description":"A connection request LinkedIn sent the moment Connect was pressed, before its note could be added: the invitation went, the note did not.","title":"Sent Without Note","type":"boolean"},"sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sequence Id"},"sequence_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sequence Name"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Step Id"},"step_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The step as its card in the Builder names it; null outside a sequence.","title":"Step Name"},"step_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Step Position"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"task_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Its task on the Tasks page, when it had one.","title":"Task Id"},"thread_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The inbox conversation, when there is one.","title":"Thread Id"}},"required":["id","sender_profile_id","sender_profile_name","channel","kind","occurred_at","outcome","decision","decided_by_display_name","decided_at","ask_reason","agent_written","contact_label","contact_identity","sequence_id","sequence_name","step_id","step_name","step_position","task_id","linkedin_action_id","mailbox_id","mailbox_address","thread_id","subject","body","detail","error_code"],"title":"OutreachActivityReadSchema","type":"object"},"OutreachActivitySettings":{"description":"Settings for the outreach-activity action: which signal to return.","properties":{"field":{"default":"summary","enum":["summary","in_live_sequence","live_sequences","reply_threads","total_matching_threads","last_reply_at","bounced"],"title":"Field","type":"string"},"kind":{"const":"outreach_activity","default":"outreach_activity","title":"Kind","type":"string"}},"title":"OutreachActivitySettings","type":"object"},"OutreachApprovalScheduleReadSchema":{"description":"When the work an approval just let go is expected to run, per channel.","properties":{"email_count":{"description":"How many approved emails the engine now sends.","title":"Email Count","type":"integer"},"email_held":{"default":0,"description":"How many of the approved emails wait for their paused sequence to be resumed. They go out after Resume sequence, not before.","title":"Email Held","type":"integer"},"email_starts_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the approved emails start, if every one of their running sequences' sending windows is closed now: the earliest opening. Null when they go now, or when every one of them waits for a paused sequence.","title":"Email Starts At"},"linkedin":{"description":"One entry per sender whose LinkedIn steps were approved.","items":{"$ref":"#/components/schemas/LinkedInApprovalScheduleReadSchema"},"title":"Linkedin","type":"array"}},"required":["linkedin","email_count","email_starts_at"],"title":"OutreachApprovalScheduleReadSchema","type":"object"},"OutreachChangeKind":{"description":"The event kinds the outreach change feed emits.","enum":["hello","tasks_changed","contacts_changed","linkedin_steps_changed","activity_changed","resync","reconnect"],"title":"OutreachChangeKind","type":"string"},"OutreachContactsChangedEventSchema":{"description":"Contacts of a sequence changed; refetch that sequence's reads.\n\n``sequence_id`` None means more than one sequence changed in the same\ntransaction, and every sequence read on screen should refetch.","properties":{"sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sequence Id"}},"title":"OutreachContactsChangedEventSchema","type":"object"},"OutreachHelloEventSchema":{"description":"Sent first on every connection; the client refetches what it shows.","properties":{"heartbeat_seconds":{"title":"Heartbeat Seconds","type":"integer"}},"required":["heartbeat_seconds"],"title":"OutreachHelloEventSchema","type":"object"},"OutreachLinkedInStepsChangedEventSchema":{"description":"A LinkedIn account's steps or browser presence changed.\n\n``account_id`` None means more than one account changed in the same\ntransaction.","properties":{"account_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Account Id"}},"title":"OutreachLinkedInStepsChangedEventSchema","type":"object"},"OutreachReconnectEventSchema":{"description":"The server is closing the stream on purpose; reconnect straight away.","properties":{},"title":"OutreachReconnectEventSchema","type":"object"},"OutreachResyncEventSchema":{"description":"Frames may have been dropped; refetch everything outreach on screen.","properties":{},"title":"OutreachResyncEventSchema","type":"object"},"OutreachStreamEventSchema":{"description":"One frame of the workspace's outreach stream, as the documentation describes it.\n\n``kind`` is the SSE ``event:`` field and ``data`` the frame's payload. Every\nframe is a wake-up, never data: the client refetches what the kind names.","properties":{"data":{"anyOf":[{"$ref":"#/components/schemas/OutreachHelloEventSchema"},{"$ref":"#/components/schemas/OutreachTasksChangedEventSchema"},{"$ref":"#/components/schemas/OutreachContactsChangedEventSchema"},{"$ref":"#/components/schemas/OutreachLinkedInStepsChangedEventSchema"},{"$ref":"#/components/schemas/OutreachActivityChangedEventSchema"},{"$ref":"#/components/schemas/OutreachResyncEventSchema"},{"$ref":"#/components/schemas/OutreachReconnectEventSchema"}],"description":"The frame's payload, by kind.","title":"Data"},"kind":{"$ref":"#/components/schemas/OutreachChangeKind","description":"`hello` on connect and `resync` after a gap: refetch everything outreach on screen. `tasks_changed`: the task list and counts. `contacts_changed`: the sequence's contact reads (every sequence's when `sequence_id` is null). `linkedin_steps_changed`: the account's LinkedIn queue, history and state (every account's when `account_id` is null). `activity_changed`: the sender's Activity (every sender's when `sender_profile_id` is null). `reconnect`: open a new stream."}},"required":["kind","data"],"title":"OutreachStreamEventSchema","type":"object"},"OutreachTaskApprovalReadSchema":{"description":"One approved task's row, and when the work it let go is expected to run.","properties":{"approved_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Approved At"},"approved_by_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who approved it, as a name. Null when nobody has, or the person could not be resolved.","title":"Approved By Display Name"},"ask_reason":{"anyOf":[{"$ref":"#/components/schemas/AskReason"},{"type":"null"}],"description":"Why this message or step is waiting for a person instead of running on its own. It stays on the task after it is decided, so the history still says why it was asked. Null when no reason was recorded.\n\nAbout the message: `low_confidence` the agent was not sure of it; `findings` a check found a problem in it, such as a placeholder that never filled in; `insufficient_data` the agent knew too little about the contact to write something only they could receive; `policy` it breaks one of the agent's content rules, such as a link, phone number or figure that is not in the contact's data.\n\nAbout the settings: `always_ask` the sender has a person approve every email, or every LinkedIn step; `sequence_manual` the sequence asks for approval of every email or LinkedIn step; `step_requires_approval` this step asks for approval; `sender_switched_to_manual` the LinkedIn step was on its way unattended when its sender switched to asking first, so it waits for a person again.\n\nAbout sending limits: `daily_cap` the mailbox has reached its daily limit; `consecutive_cap` the agent sent the last reply and nobody has written since; `thread_cap` the conversation has had as many unattended replies as it may; `hourly_cap` the mailbox has reached its hourly reply limit; `org_daily_cap` the workspace has reached its daily reply limit.\n\nAbout the conversation: `stale_inbound` a newer message arrived, or the one being answered is too old; `unverified_sender` the reply could not be confirmed as coming from the contact; `different_sender` someone other than the contact wrote it; `authentication` it failed email authentication or was marked as spam; `label` the reply is not one the agent answers on its own; `suppressed` the contact is on the do-not-contact list; `sequence_gone` the sequence or the agent's message no longer exists; `linkedin_only` the contact is known only by LinkedIn, so no unsubscribe could be honoured.\n\nAbout the other side: `bot_question` the contact asked whether they are talking to a bot or an AI; `question` the contact asked something a person should answer; `automated_counterparty` the other side appears to be an automated system; `language` the message is not in the expected language.\n\n`kill_switch` unattended sending is paused for the workspace or the platform."},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The rendered message as it will send: an email body, a note, a LinkedIn message.","title":"Body"},"channel":{"$ref":"#/components/schemas/TaskChannel"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How sure the agent was that its message could go out unedited: `high` (a person could send it unread), `medium` (worth a glance) or `low` (needs work). Null when no agent wrote the message.","title":"Confidence"},"confidence_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The number behind `confidence`: the agent's own score for its message, from 0 to 100. Read from the agent's message as it stands now. Null when no agent wrote the message, or the agent gave no score.","title":"Confidence Score"},"contact_company":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact's company, from whichever column of the audience table holds it ('Company', 'Company Name', 'Organization' and the like). Null when the table has none or leaves it blank.","title":"Contact Company"},"contact_fields":{"description":"Every filled column of the contact's audience row, in the table's order. Empty for housekeeping work and for a row since deleted.","items":{"$ref":"#/components/schemas/OutreachTaskContactFieldSchema"},"title":"Contact Fields","type":"array"},"contact_identity":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The address, profile slug or number behind the label, so a row can show the name and still say who that is. Equal to the label where no name was found; null for housekeeping.","title":"Contact Identity"},"contact_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact as the queue names them: a name, else an address or a profile URL.","title":"Contact Label"},"contact_title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact's job title, from whichever column of the audience table holds it ('Job Title', 'Title', 'Position' and the like). Null when the table has none or leaves it blank.","title":"Contact Title"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"due_at":{"description":"When the channel would run it if nobody were in the way.","format":"date-time","title":"Due At","type":"string"},"editable":{"description":"Whether the queue may rewrite the message before approving: pending, and a kind that carries text.","title":"Editable","type":"boolean"},"enrolment_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Enrolment Id"},"flagged":{"description":"Whether a check found a problem in the agent's message (any finding at warning strength), whatever `ask_reason` says: a task held for a setting can still carry a message with a placeholder that never filled in. False when no agent wrote the message.","title":"Flagged","type":"boolean"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"description":"The LinkedIn action kind slug or `email`.","title":"Kind","type":"string"},"linkedin_action_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Linkedin Action Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What the person wrote when settling it: why they rejected it.","title":"Note"},"outbound_message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The message the Outbound Agent wrote for this task. Null when a person wrote the words, and on a LinkedIn step that carries no message.","title":"Outbound Message Id"},"outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How it ended: the channel's own terminal word.","title":"Outcome"},"progress":{"anyOf":[{"$ref":"#/components/schemas/OutreachTaskProgressReadSchema"},{"type":"null"}],"description":"Where the work stands once the queue has let it go, read from the channel: set on approved, finished and cancelled tasks, null on a task still waiting on a person and on one a person rejected."},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A separate AI review's score for the agent's message, from 0 to 100: how likely a busy person in the recipient's role is to read it to the end and reply. Null when no agent wrote the message, or when it was not reviewed.","title":"Quality Score"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The agent's own note on its message: what it built the message on and what it was unsure about. Null when no agent wrote the message.","title":"Reasoning"},"record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Record Id"},"rejected_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Rejected At"},"rejected_by_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected By Display Name"},"reply_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For an email that replies in the contact's existing thread, the subject it will go out with, such as 'Re: Quick question'. Null for a first email, which carries its own `subject`, and for anything that is not an email.","title":"Reply Subject"},"resolved_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Resolved At"},"schedule":{"anyOf":[{"$ref":"#/components/schemas/OutreachApprovalScheduleReadSchema"},{"type":"null"}],"description":"When the approved step is expected to run, as the bulk approve reports it. Null when the task had moved on instead of being approved, or when the schedule could not be read (the approval stands either way)."},"sender_browser_online":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"For a LinkedIn task still waiting on a person: whether a browser is checked in for its sender right now, so approving it would run it soon. False means an approved step waits until a browser is open. Null for every other task.","title":"Sender Browser Online"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sender Profile Id"},"sender_profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null when nobody in particular sends it, or the sender was deleted.","title":"Sender Profile Name"},"sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sequence Id"},"sequence_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null for housekeeping work, or for a sequence since deleted.","title":"Sequence Name"},"sequence_paused":{"default":false,"description":"Its sequence is paused right now: approving the task records the approval, and the step waits for Resume sequence before it runs, on either channel.","title":"Sequence Paused","type":"boolean"},"status":{"$ref":"#/components/schemas/TaskStatus"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Step Id"},"step_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The step as the builder names it; null when the step no longer exists.","title":"Step Name"},"step_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The step's customer-visible ordinal, zero-based; null with the name.","title":"Step Position"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","channel","kind","status","sequence_id","sequence_name","step_id","step_name","step_position","enrolment_id","record_id","sender_profile_id","sender_profile_name","contact_label","subject","body","due_at","created_at","updated_at","approved_at","approved_by_display_name","rejected_at","rejected_by_display_name","resolved_at","outcome","note","linkedin_action_id","editable","outbound_message_id","confidence","confidence_score","flagged","quality_score","reasoning","ask_reason"],"title":"OutreachTaskApprovalReadSchema","type":"object"},"OutreachTaskApproveSchema":{"description":"Whether the person read the task before approving it.","properties":{"opened":{"default":false,"description":"The person opened the task and read its message before approving. Words the agent wrote that they approved without changing are then recorded as approved as written: a record of their Looks good, which never trains the agent.","title":"Opened","type":"boolean"}},"title":"OutreachTaskApproveSchema","type":"object"},"OutreachTaskContactFieldSchema":{"description":"One filled column of the contact's audience row.","properties":{"name":{"description":"The column's header, as the table names it.","title":"Name","type":"string"},"value":{"description":"What the row holds there, as text; long values are cut.","title":"Value","type":"string"}},"required":["name","value"],"title":"OutreachTaskContactFieldSchema","type":"object"},"OutreachTaskCountSchema":{"description":"The nav badge's count, and the failures the Tasks page raises beside it.","properties":{"failed_retryable":{"description":"Failed LinkedIn steps whose contact can still be retried (the contact is still stopped as failed). Not part of the badge.","title":"Failed Retryable","type":"integer"},"pending":{"description":"Tasks waiting on a person: the nav badge.","title":"Pending","type":"integer"}},"required":["pending","failed_retryable"],"title":"OutreachTaskCountSchema","type":"object"},"OutreachTaskEditSchema":{"description":"Rewrite what a pending task will send.\n\n``subject`` left out keeps the subject the task already carries; an\nexplicit null clears it, which for an email means the follow-up lands\nin-thread. The two are told apart on the wire so a client fixing a typo\nin the body cannot silently strip a first email's subject.","properties":{"body":{"maxLength":50000,"minLength":1,"title":"Body","type":"string"},"subject":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Subject"}},"required":["body"],"title":"OutreachTaskEditSchema","type":"object"},"OutreachTaskEmailReadSchema":{"description":"An email card's email beyond its words: what the send adds below them, and what left.","properties":{"closing":{"anyOf":[{"$ref":"#/components/schemas/EmailClosingReadSchema"},{"type":"null"}],"description":"What the send adds below the card's words, the sender's signature and then the sequence's opt-out footer, so the card shows the email whole as the contact will get it. Its unsubscribe link unsubscribes nobody. Null for a LinkedIn task or one no sequence sends."},"email_html":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Once the email went, its HTML part exactly as it was handed to Gmail: the words, the signature and the footer, every line and space as the contact got them. Null until it goes.","title":"Email Html"},"plain_text_only":{"default":true,"description":"Whether the sequence sends plain text, which is how the words and the closing are laid out: marks stripped, or bold, italic and links kept.","title":"Plain Text Only","type":"boolean"}},"required":["closing","email_html"],"title":"OutreachTaskEmailReadSchema","type":"object"},"OutreachTaskLengthSchema":{"description":"How many tasks the queue's filters select, and why they wait: the footer and Held because.","properties":{"ask_reasons":{"description":"Why the tasks every other filter selects are held for a person, the reasons Held because can narrow them to: `ask_reason` itself is left out of this read, so picking one never hides the others. Empty when none of them carries a reason.","items":{"$ref":"#/components/schemas/AskReason"},"title":"Ask Reasons","type":"array"},"count":{"description":"How many tasks match the filters.","title":"Count","type":"integer"}},"required":["count","ask_reasons"],"title":"OutreachTaskLengthSchema","type":"object"},"OutreachTaskProgressReadSchema":{"description":"Where an approved, finished or failed task's work stands, read from its channel.","properties":{"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why a failed LinkedIn step failed, as the channel's error code; null otherwise.","title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why it failed, as a sentence from the channel or the send engine; null otherwise.","title":"Error Message"},"hold":{"anyOf":[{"$ref":"#/components/schemas/StepHold"},{"type":"null"}],"description":"For a `paused` task, what holds it: `sequence_paused` its sequence is paused, `contact_paused` its contact is. Null otherwise."},"hold_reason":{"anyOf":[{"$ref":"#/components/schemas/HoldReason"},{"type":"null"}],"description":"Why a held email waits: `window` the sequence's sending window is closed, `daily_cap` its mailboxes are out of today's capacity, `pacing` the mailbox's next slot is later, `no_mailbox` no mailbox is connected, `agent_writing` / `agent_queued` / `agent_unavailable` / `no_message` its words are not ready (`agent_queued`: in line to be written, behind the messages the sequence already keeps written ahead), `confirming_send` Gmail never confirmed the last send and it is being checked before anything is sent again; and why a held LinkedIn step waits: `no_linkedin_account` no sender on the sequence has LinkedIn connected. Null otherwise."},"linkedin_queue":{"anyOf":[{"$ref":"#/components/schemas/LinkedInQueueState"},{"type":"null"}],"description":"For a queued or running LinkedIn step, where it stands in its account's line: `queued` (with `starts_at` and `steps_ahead`), `running`, `outside_window` (its sequence's sending hours are shut in the sender's timezone; `starts_at` is when it is expected to start once they open), `daily_limit` or `weekly_limit` (with `resets_at`), `kind_disabled` (this kind's limit is 0), `browser_offline` (no browser checked in for the sender), `verify_account` (LinkedIn is asking the member to verify the account) or `disconnected` (the account is not connected). Null otherwise."},"may_have_sent":{"description":"A failed LinkedIn message or InMail that may have reached the person anyway (the browser timed out, lost its tab or went silent mid-step): a retry could send it twice, so confirm first.","title":"May Have Sent","type":"boolean"},"pause_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For a task its paused sequence holds, why the sequence paused, as the sequence's own `pause_reason` (`manual`, `credits`, `spending_limit`, `bounces`, `mailboxes`, `linkedin`). Null otherwise.","title":"Pause Reason"},"resets_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The reset that frees a LinkedIn step a daily or weekly limit holds, midnight in the sender's timezone; null otherwise.","title":"Resets At"},"retryable":{"description":"The contact is stopped as failed at this moment, so a retry of their journey (the `retry` journey action on their enrolment) runs the step again.","title":"Retryable","type":"boolean"},"starts_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When it is expected to start: a LinkedIn step's forecast, or when a held email's wait ends. An estimate; null when no time can honestly be named.","title":"Starts At"},"state":{"$ref":"#/components/schemas/TaskProgressState","description":"Where the work stands. `queued` it is in its sender's LinkedIn line (see `linkedin_queue`), or approved and about to join it; `running` a browser is doing it now; `sending` an approved email is going out now; `held` an approved email, or an approved LinkedIn step not yet in its sender's line, waits (see `hold_reason` and `starts_at`); `paused` an approved step on either channel waits for its paused sequence or paused contact to be resumed (see `hold` and `pause_reason`) and is in no line until then; `sent` it happened; `skipped` it did not apply, or was passed over in the extension; `failed` it could not be done (see `error_code`, `retryable`); `rejected` a person refused it; `stopped` the contact was stopped under it, or it was replaced."},"steps_ahead":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How many of the sender's LinkedIn steps run before this one; null otherwise.","title":"Steps Ahead"}},"required":["state","linkedin_queue","starts_at","steps_ahead","resets_at","hold_reason","error_code","error_message","retryable","may_have_sent"],"title":"OutreachTaskProgressReadSchema","type":"object"},"OutreachTaskReadSchema":{"description":"One row of the approval queue, every name the page shows resolved server-side.\n\nThe task table stores ids; the page shows names. The sequence, the step,\nthe sender and the deciding person are all resolved here rather than by\nthe client, so no raw actor id ever crosses the wire and a sequence or\nsender since deleted reads as a blank rather than a broken lookup.","properties":{"approved_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Approved At"},"approved_by_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who approved it, as a name. Null when nobody has, or the person could not be resolved.","title":"Approved By Display Name"},"ask_reason":{"anyOf":[{"$ref":"#/components/schemas/AskReason"},{"type":"null"}],"description":"Why this message or step is waiting for a person instead of running on its own. It stays on the task after it is decided, so the history still says why it was asked. Null when no reason was recorded.\n\nAbout the message: `low_confidence` the agent was not sure of it; `findings` a check found a problem in it, such as a placeholder that never filled in; `insufficient_data` the agent knew too little about the contact to write something only they could receive; `policy` it breaks one of the agent's content rules, such as a link, phone number or figure that is not in the contact's data.\n\nAbout the settings: `always_ask` the sender has a person approve every email, or every LinkedIn step; `sequence_manual` the sequence asks for approval of every email or LinkedIn step; `step_requires_approval` this step asks for approval; `sender_switched_to_manual` the LinkedIn step was on its way unattended when its sender switched to asking first, so it waits for a person again.\n\nAbout sending limits: `daily_cap` the mailbox has reached its daily limit; `consecutive_cap` the agent sent the last reply and nobody has written since; `thread_cap` the conversation has had as many unattended replies as it may; `hourly_cap` the mailbox has reached its hourly reply limit; `org_daily_cap` the workspace has reached its daily reply limit.\n\nAbout the conversation: `stale_inbound` a newer message arrived, or the one being answered is too old; `unverified_sender` the reply could not be confirmed as coming from the contact; `different_sender` someone other than the contact wrote it; `authentication` it failed email authentication or was marked as spam; `label` the reply is not one the agent answers on its own; `suppressed` the contact is on the do-not-contact list; `sequence_gone` the sequence or the agent's message no longer exists; `linkedin_only` the contact is known only by LinkedIn, so no unsubscribe could be honoured.\n\nAbout the other side: `bot_question` the contact asked whether they are talking to a bot or an AI; `question` the contact asked something a person should answer; `automated_counterparty` the other side appears to be an automated system; `language` the message is not in the expected language.\n\n`kill_switch` unattended sending is paused for the workspace or the platform."},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The rendered message as it will send: an email body, a note, a LinkedIn message.","title":"Body"},"channel":{"$ref":"#/components/schemas/TaskChannel"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How sure the agent was that its message could go out unedited: `high` (a person could send it unread), `medium` (worth a glance) or `low` (needs work). Null when no agent wrote the message.","title":"Confidence"},"confidence_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The number behind `confidence`: the agent's own score for its message, from 0 to 100. Read from the agent's message as it stands now. Null when no agent wrote the message, or the agent gave no score.","title":"Confidence Score"},"contact_company":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact's company, from whichever column of the audience table holds it ('Company', 'Company Name', 'Organization' and the like). Null when the table has none or leaves it blank.","title":"Contact Company"},"contact_fields":{"description":"Every filled column of the contact's audience row, in the table's order. Empty for housekeeping work and for a row since deleted.","items":{"$ref":"#/components/schemas/OutreachTaskContactFieldSchema"},"title":"Contact Fields","type":"array"},"contact_identity":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The address, profile slug or number behind the label, so a row can show the name and still say who that is. Equal to the label where no name was found; null for housekeeping.","title":"Contact Identity"},"contact_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact as the queue names them: a name, else an address or a profile URL.","title":"Contact Label"},"contact_title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact's job title, from whichever column of the audience table holds it ('Job Title', 'Title', 'Position' and the like). Null when the table has none or leaves it blank.","title":"Contact Title"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"due_at":{"description":"When the channel would run it if nobody were in the way.","format":"date-time","title":"Due At","type":"string"},"editable":{"description":"Whether the queue may rewrite the message before approving: pending, and a kind that carries text.","title":"Editable","type":"boolean"},"enrolment_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Enrolment Id"},"flagged":{"description":"Whether a check found a problem in the agent's message (any finding at warning strength), whatever `ask_reason` says: a task held for a setting can still carry a message with a placeholder that never filled in. False when no agent wrote the message.","title":"Flagged","type":"boolean"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"description":"The LinkedIn action kind slug or `email`.","title":"Kind","type":"string"},"linkedin_action_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Linkedin Action Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What the person wrote when settling it: why they rejected it.","title":"Note"},"outbound_message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The message the Outbound Agent wrote for this task. Null when a person wrote the words, and on a LinkedIn step that carries no message.","title":"Outbound Message Id"},"outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How it ended: the channel's own terminal word.","title":"Outcome"},"progress":{"anyOf":[{"$ref":"#/components/schemas/OutreachTaskProgressReadSchema"},{"type":"null"}],"description":"Where the work stands once the queue has let it go, read from the channel: set on approved, finished and cancelled tasks, null on a task still waiting on a person and on one a person rejected."},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A separate AI review's score for the agent's message, from 0 to 100: how likely a busy person in the recipient's role is to read it to the end and reply. Null when no agent wrote the message, or when it was not reviewed.","title":"Quality Score"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The agent's own note on its message: what it built the message on and what it was unsure about. Null when no agent wrote the message.","title":"Reasoning"},"record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Record Id"},"rejected_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Rejected At"},"rejected_by_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected By Display Name"},"reply_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For an email that replies in the contact's existing thread, the subject it will go out with, such as 'Re: Quick question'. Null for a first email, which carries its own `subject`, and for anything that is not an email.","title":"Reply Subject"},"resolved_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Resolved At"},"sender_browser_online":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"For a LinkedIn task still waiting on a person: whether a browser is checked in for its sender right now, so approving it would run it soon. False means an approved step waits until a browser is open. Null for every other task.","title":"Sender Browser Online"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sender Profile Id"},"sender_profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null when nobody in particular sends it, or the sender was deleted.","title":"Sender Profile Name"},"sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sequence Id"},"sequence_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null for housekeeping work, or for a sequence since deleted.","title":"Sequence Name"},"sequence_paused":{"default":false,"description":"Its sequence is paused right now: approving the task records the approval, and the step waits for Resume sequence before it runs, on either channel.","title":"Sequence Paused","type":"boolean"},"status":{"$ref":"#/components/schemas/TaskStatus"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Step Id"},"step_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The step as the builder names it; null when the step no longer exists.","title":"Step Name"},"step_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The step's customer-visible ordinal, zero-based; null with the name.","title":"Step Position"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","channel","kind","status","sequence_id","sequence_name","step_id","step_name","step_position","enrolment_id","record_id","sender_profile_id","sender_profile_name","contact_label","subject","body","due_at","created_at","updated_at","approved_at","approved_by_display_name","rejected_at","rejected_by_display_name","resolved_at","outcome","note","linkedin_action_id","editable","outbound_message_id","confidence","confidence_score","flagged","quality_score","reasoning","ask_reason"],"title":"OutreachTaskReadSchema","type":"object"},"OutreachTaskRejectSchema":{"description":"Why the task was refused; kept on the row as its note.","properties":{"reason":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{"type":"null"}],"description":"Why it was refused, kept on the task. On words the agent wrote it is also the person's Needs work note, which teaches the agent what to do differently.","title":"Reason"}},"title":"OutreachTaskRejectSchema","type":"object"},"OutreachTaskThreadEditSchema":{"description":"Rewrite one follow-up on a pending email card.\n\n``subject`` left out keeps the follow-up's own subject; a follow-up that\nreplies in the thread above it has none, and any given to it is ignored.","properties":{"body":{"maxLength":50000,"minLength":1,"title":"Body","type":"string"},"message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The follow-up's message_id as the card read it: an edit over a follow-up written again since is refused with 409.","title":"Message Id"},"subject":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"A new subject for a follow-up that has its own; leave it out to keep it.","title":"Subject"}},"required":["body"],"title":"OutreachTaskThreadEditSchema","type":"object"},"OutreachTaskThreadEmailSchema":{"description":"One follow-up the agent drafted with the card's email: approving the card approves it.","properties":{"body":{"description":"What it will send, as drafted or as a person edited it.","title":"Body","type":"string"},"message_id":{"description":"The agent's message holding its words; a new one when it is written again.","format":"uuid","title":"Message Id","type":"string"},"step_id":{"description":"The follow-up's step.","format":"uuid","title":"Step Id","type":"string"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Its own subject, or null when it replies in the thread above it.","title":"Subject"},"wait_amount":{"description":"How long after the email before it the step waits.","title":"Wait Amount","type":"integer"},"wait_unit":{"description":"The unit of that wait: `minutes`, `hours` or `days`.","title":"Wait Unit","type":"string"}},"required":["step_id","message_id","subject","body","wait_amount","wait_unit"],"title":"OutreachTaskThreadEmailSchema","type":"object"},"OutreachTaskThreadReadSchema":{"description":"The rest of the thread an email card covers.\n\nThe emails the agent drafted for the contact after the card's own, in the\norder they go. One approval covers them all: approving the card approves\neach to send as written when its turn comes, with no card of its own, and\nrejecting the card stops the contact. Empty for a LinkedIn task and an\nemail nothing was drafted after.","properties":{"emails":{"items":{"$ref":"#/components/schemas/OutreachTaskThreadEmailSchema"},"title":"Emails","type":"array"}},"required":["emails"],"title":"OutreachTaskThreadReadSchema","type":"object"},"OutreachTasksChangedEventSchema":{"description":"Something in the approval queue changed; refetch the task list and count.","properties":{},"title":"OutreachTasksChangedEventSchema","type":"object"},"PageContextSchema":{"description":"What the person had open when they sent the message.\n\nSo \"this table\" resolves without them naming it. Sent by the dashboard,\noptional everywhere: a message from anywhere else simply carries none.\nKept with the message and read back with it, so the transcript can say\nwhere each message was sent from.","properties":{"entity_id":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"The id of that thing.","title":"Entity Id"},"entity_name":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"What it is called, as the page showed it, so the assistant can say it back. Cut to 255 characters rather than refused.","title":"Entity Name"},"entity_type":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"What the page is about: `table`, `sequence`, `agent`, `integration`, `inbox thread`, `sender` or `mailbox`. Null on a page about no one thing.","title":"Entity Type"},"page_name":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"The page or tab they have open, in the screen's own words: a sequence's \"Audience\" tab, an agent's \"Train\", or a page about no one thing, such as \"Tasks\".","title":"Page Name"},"route":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"description":"The path they have open, e.g. `/tables/1234`.","title":"Route"},"selected_step_id":{"anyOf":[{"pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","type":"string"},{"type":"null"}],"description":"The selected sequence builder step; resolve it against the sequence before editing.","title":"Selected Step Id"},"selected_step_label":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"The selected step as the Builder numbers and names it, e.g. \"Step 1 · Opener\". The id is what to edit by; this is how the person sees it.","title":"Selected Step Label"}},"title":"PageContextSchema","type":"object"},"PaginatedResponse_APIKeyRead_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/APIKeyRead"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[APIKeyRead]","type":"object"},"PaginatedResponse_AffiliateLedgerEntryReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/AffiliateLedgerEntryReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[AffiliateLedgerEntryReadSchema]","type":"object"},"PaginatedResponse_CreditLedgerEntrySchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/CreditLedgerEntrySchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[CreditLedgerEntrySchema]","type":"object"},"PaginatedResponse_DesignPartnerFeedbackReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/DesignPartnerFeedbackReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[DesignPartnerFeedbackReadSchema]","type":"object"},"PaginatedResponse_EnrichmentAuditLogReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/EnrichmentAuditLogReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[EnrichmentAuditLogReadSchema]","type":"object"},"PaginatedResponse_HealthCheckReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/HealthCheckReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[HealthCheckReadSchema]","type":"object"},"PaginatedResponse_InboxkitImportRunReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/InboxkitImportRunReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[InboxkitImportRunReadSchema]","type":"object"},"PaginatedResponse_IntegrationAuditLogReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/IntegrationAuditLogReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[IntegrationAuditLogReadSchema]","type":"object"},"PaginatedResponse_IntegrationRead_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/IntegrationRead"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[IntegrationRead]","type":"object"},"PaginatedResponse_IntegrationTypeRead_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/IntegrationTypeRead"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[IntegrationTypeRead]","type":"object"},"PaginatedResponse_OutreachActivityReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/OutreachActivityReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[OutreachActivityReadSchema]","type":"object"},"PaginatedResponse_OutreachTaskReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/OutreachTaskReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[OutreachTaskReadSchema]","type":"object"},"PaginatedResponse_ReferralReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/ReferralReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[ReferralReadSchema]","type":"object"},"PaginatedResponse_SequenceAuditLogReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/SequenceAuditLogReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[SequenceAuditLogReadSchema]","type":"object"},"PaginatedResponse_TableReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/TableReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[TableReadSchema]","type":"object"},"PaginatedResponse_TableRunReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/TableRunReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[TableRunReadSchema]","type":"object"},"PaginatedResponse_TableSourceRunSkipSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/TableSourceRunSkipSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[TableSourceRunSkipSchema]","type":"object"},"PaginatedResponse_TrashedSequenceReadSchema_":{"properties":{"data":{"description":"The list of ResponseItems.","items":{"$ref":"#/components/schemas/TrashedSequenceReadSchema"},"title":"Data","type":"array"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the next page. If there are no more pages, this is None."},"previous_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cursor to the previous page. If there are no previous pages, this is None."}},"title":"PaginatedResponse[TrashedSequenceReadSchema]","type":"object"},"PastedKind":{"description":"What a pasted list turned out to hold, so the transcript can say \"128 domains\".\n\nThe composer works this out from the entries before sending; the server\nworks it out again from the stored entries when the transcript is read,\nwith the same rule, so the card a person saw before pressing Enter is the\ncard the conversation keeps. ``ENTRIES`` is a list of nothing in\nparticular, which still counts.","enum":["domains","emails","names","entries"],"title":"PastedKind","type":"string"},"PaymentMethodReadSchema":{"description":"Displayable summary of the organization's default payment card.","properties":{"brand":{"description":"The card brand, e.g. 'visa'.","title":"Brand","type":"string"},"exp_month":{"description":"The card expiry month (1-12).","title":"Exp Month","type":"integer"},"exp_year":{"description":"The four-digit card expiry year.","title":"Exp Year","type":"integer"},"last4":{"description":"The last four digits of the card number.","title":"Last4","type":"string"}},"required":["brand","last4","exp_month","exp_year"],"title":"PaymentMethodReadSchema","type":"object"},"PaymentRequiredResponse":{"properties":{"detail":{"description":"The detail of why payment is required.","title":"Detail","type":"string"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"PayoutEmailUpdateSchema":{"description":"The PayPal account payouts are sent to.","properties":{"email":{"description":"The PayPal account email.","format":"email","maxLength":320,"title":"Email","type":"string"}},"required":["email"],"title":"PayoutEmailUpdateSchema","type":"object"},"PeopleQuerySchema":{"description":"Filters for a people search.","properties":{"active_profile_only":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Excludes profiles the index has deleted or hidden."},"certifications":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"A certification they hold, matched on its name or its issuer."},"cities":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Cities the person lives in."},"company_cities":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Cities the current employer's headquarters are in."},"company_countries":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Countries the current employer's headquarters are in, written out in full, as in United States."},"company_founded":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The year their current employer was founded."},"company_funded_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only people whose employer last raised on or after this day, as YYYY-MM-DD.","title":"Company Funded After"},"company_funding_amount":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The size of their current employer's last round, in US dollars."},"company_headcount":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Their current employer's employee count."},"company_headcount_growth":{"anyOf":[{"$ref":"#/components/schemas/GrowthFilterSchema"},{"type":"null"}],"description":"Headcount change at their current employer over a window, as a percentage band."},"company_headcount_growth_percent":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Yearly headcount change at the current employer, as a percentage. Replaces the growth filter with a timespan, which this search cannot narrow by."},"company_identifier":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Their current employer, as domains, LinkedIn company URLs or numeric LinkedIn ids, mixed freely."},"company_industry":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The current employer's industry, from the lead database's fixed industry list. Matched case-insensitively; a value outside the list is refused and the nearest entry is named."},"company_is_b2b":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether their current employer sells to businesses, by the index's own reading."},"company_keyword":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Words in the categories and keywords filed on their current employer."},"company_location":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Retired: use company_countries. Still accepted, and its values are searched as company_countries (the country of the current employer's headquarters, spelled as the country list spells it), so older saved searches and callers keep working."},"company_name":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Their current employer's name, the brand it goes by."},"company_revenue":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Their current employer's annual revenue, in US dollars. An estimate many companies lack, so it narrows hard."},"company_size_bands":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Their employer's headcount as a band, one of: Myself Only, 1-10 employees, 11-50 employees, 51-200 employees, 201-500 employees, 501-1000 employees, 1001-5000 employees, 5001-10,000 employees or 10,001+ employees. Offered beside the numeric headcount because each reaches companies the other does not."},"company_states":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"States or provinces the current employer's headquarters are in, written out in full."},"company_table":{"anyOf":[{"$ref":"#/components/schemas/CompanyTableFilterSchema"},{"type":"null"}],"description":"Their current employer is one of the companies in a column of one of your tables, or is not. The column is read again every time the search counts, previews or runs, so the search follows the table as it changes. Its companies join company_identifier on the same side."},"company_type":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The current employer's type, one of: Privately Held, Public Company, Self-Employed, Self-Owned, Partnership, Nonprofit, Educational or Government Agency. Matched case-insensitively; any other spelling is refused rather than quietly matching nothing."},"company_website":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Their current employer's website domain, as stripe.com."},"connections":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many connections their professional profile has."},"countries":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Countries the person lives in, written out in full. Without profile_location, countries, states and cities narrow one another, so United States, California and San Francisco together ask for San Francisco."},"degree":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"What they studied: the subject of a degree, as their profile writes it."},"departments":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Departments, one of: Administrative, C-Suite, Consulting, Customer Service, Design, Education, Engineering and Technical, Finance & Accounting, General Management, Human Resources, Legal, Marketing, Medical, Operations, Other, Product, Project Management, Real Estate, Research, Sales or Trades. The index stores these whole, so a value outside the list is refused rather than quietly matching nothing."},"first_name":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The person's first name, as their profile spells it."},"followers":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many followers their professional profile has."},"graduated":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Graduation YEAR, as a range. The index stores a year, not a date."},"is_decision_maker":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether they make buying decisions, by the index's own reading."},"is_working":{"anyOf":[{"$ref":"#/components/schemas/FlagFilterSchema"},{"type":"null"}],"description":"Whether they are employed now, by the index's own reading."},"job_title":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The title of the job they hold now, matched as a phrase. Several values are alternatives, so send the ways a role is really spelled."},"keyword":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Words in their profile headline."},"language_proficiency":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"How well they speak a language they list, beside the language itself."},"languages":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Languages they speak, written out in English, as in Spanish."},"last_name":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The person's last name, as their profile spells it."},"left_company_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only people who left a past role on or after this day, as YYYY-MM-DD.","title":"Left Company After"},"left_company_before":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only people who left a past role on or before this day, as YYYY-MM-DD.","title":"Left Company Before"},"location":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The older name for profile_location, read only when profile_location is not set. Prefer profile_location."},"management_levels":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Seniority, one of: C-Level, Director, Founder, Head, Intern, Manager, Owner, Partner, President/Vice President, Senior, Specialist or Vice President. Refused the same way as departments. President/Vice President is the rung the index fills; Vice President is kept but reaches almost nobody."},"past_company_cities":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Cities a previous employer's headquarters are in, for the same past role."},"past_company_countries":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Countries a previous employer's headquarters are in. Every past filter describes the same past role, so with past_job_title this asks for that title at an employer there."},"past_company_headcount":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"A previous employer's employee count."},"past_company_headcount_growth":{"anyOf":[{"$ref":"#/components/schemas/GrowthFilterSchema"},{"type":"null"}],"description":"Headcount change at a previous employer over a window, as a percentage band."},"past_company_identifier":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"A previous employer, as domains, LinkedIn company URLs or numeric LinkedIn ids."},"past_company_industry":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"A previous employer's industry, from the same fixed list as company_industry. Combined with the current-employer filters, not offered as an alternative to them."},"past_company_keyword":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Words in the categories and keywords filed on a previous employer."},"past_company_location":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Retired: use past_company_countries. Still accepted, and its values are searched as past_company_countries."},"past_company_name":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"A previous employer's name. Every past filter describes the same past role."},"past_company_revenue":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"A previous employer's annual revenue, in US dollars."},"past_company_states":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"States or provinces a previous employer's headquarters are in, written out in full, for the same past role."},"past_company_table":{"anyOf":[{"$ref":"#/components/schemas/CompanyTableFilterSchema"},{"type":"null"}],"description":"A previous employer is one of the companies in a column of one of your tables, or is not; read the same way as company_table. Its companies join past_company_identifier."},"past_company_type":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"A previous employer's type, from the same eight values as company_type."},"past_company_website":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"A previous employer's website domain, as stripe.com."},"past_departments":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Departments of a role they used to hold, from the same list as departments."},"past_job_title":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"The title of a job they held before. Every past filter describes the same past role."},"past_management_levels":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Seniority of a role they used to hold, from the same list as management_levels, refused the same way."},"profile_location":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Where the person lives, whatever the location of their job, as a list of places that are alternatives to one another. A place is a country written out in full, a state or province, or a city; a comma narrows a city to its country, as in Paris, France. When this is set, countries, states and cities are read as more places in the same list rather than narrowing it."},"recommendations":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How many recommendations their profile carries."},"school":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Schools they studied at."},"skills":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Skills listed on their profile."},"started_current_role_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only people who started the job they hold now on or after this day.","title":"Started Current Role After"},"states":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"States or provinces the person lives in, written out in full."},"total_experience_months":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Whole career length in MONTHS. `years_of_experience` asks the same question in years; setting both narrows to the overlap."},"work_location":{"anyOf":[{"$ref":"#/components/schemas/TextFilterSchema"},{"type":"null"}],"description":"Where the current job is based, matched as it is written on the profile. Values are sent as typed."},"years_in_current_company":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How long they have held the job they have now, in YEARS."},"years_in_past_company":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"How long they stayed in a past role, in YEARS."},"years_of_experience":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Whole career length, in YEARS."}},"title":"PeopleQuerySchema","type":"object"},"PersonalityPreset":{"description":"The voice an agent writes in. Each preset is a real prompt; CUSTOM is the author's.","enum":["direct","consultative","bold","custom"],"title":"PersonalityPreset","type":"string"},"PostAuthorsQuerySchema":{"description":"Filters for a search for people whose own LinkedIn posts carry a phrase.\n\nThe rows are people, one per author, each carrying every matching post the\nsearch read for them. The count is of posts, since the people are folded\nfrom them once they are read.","properties":{"and_keywords":{"anyOf":[{"items":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":20,"type":"array"},"maxItems":4,"type":"array"},{"type":"null"}],"description":"Up to 4 more groups of phrases, each of which a post must ALSO carry one phrase of, with up to 20 phrases to include across keywords and every group. Each is matched the same way: keywords clay with one group expensive, credits, cost finds posts that mention clay and any of the three. Groups only narrow a search: keywords must hold a phrase too.","title":"And Keywords"},"keywords":{"anyOf":[{"$ref":"#/components/schemas/PostPhraseFilterSchema"},{"type":"null"}],"description":"Phrases a post must carry, any of them, and phrases that rule a post out, up to 20 to include across keywords and every group, and 20 to exclude. A phrase is matched whole and in order in the text the author wrote: revenue operations matches a post about revenue operations and not one about operations revenue. Punctuation between the words does not break a match, and no other form of a word does: cost does not match costs. At least one phrase in keywords is required; groups only narrow it."},"min_comments":{"anyOf":[{"maximum":1000000.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"Skip posts with fewer comments than this.","title":"Min Comments"},"min_reactions":{"anyOf":[{"maximum":1000000.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"Skip posts fewer people reacted to than this.","title":"Min Reactions"},"posted_within":{"$ref":"#/components/schemas/PostWindow","default":"past_month","description":"How recently the post went up, counted back from the day the search runs, so a saved or scheduled search keeps reading the latest posts. The past month by default. Posts reach the index about a week after they go up."}},"title":"PostAuthorsQuerySchema","type":"object"},"PostPhraseFilterSchema":{"description":"A phrase filter over the text of LinkedIn posts, capped at twenty phrases each way.","properties":{"exclude":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":20,"title":"Exclude","type":"array"},"include":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":20,"title":"Include","type":"array"}},"title":"PostPhraseFilterSchema","type":"object"},"PostWindow":{"description":"How recently a post went up for a posts search to read it, counted back from the run.\n\n``any_time`` is a member rather than a null: a stored query drops its\nnulls, and a null would come back from storage as the default window.","enum":["past_week","past_month","past_quarter","past_year","any_time"],"title":"PostWindow","type":"string"},"PreflightIssueReadSchema":{"properties":{"blocking":{"default":true,"description":"False for a finding worth a look that does not stop the launch. The launch gate ignores these; the dialog lists them after the to-dos, with the same Fix link.","title":"Blocking","type":"boolean"},"code":{"title":"Code","type":"string"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The number a finding is about, for the codes that carry one: `contacts_missing_email` carries how many audience contacts have no email that a Find work email lookup has not tried yet, `emails_not_verified` how many audience addresses have not been verified yet, and `spam_check` how many things the spam check found in the email `step_id` names, one row per email. Read this rather than a number in `message`. Null for every other code.","title":"Count"},"message":{"title":"Message","type":"string"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The step this problem is about, so the banner can select and scroll to its card. Never named in `message`, because an id is not how a customer knows a step. Null when the problem belongs to the sequence, not one step.","title":"Step Id"},"tab":{"description":"Which tab of the sequence editor fixes this problem: `builder`, `agent` (the writing settings on the Builder tab), `audience`, `settings`, `senders` or `delivery`. `senders` (the senders) and `delivery` (the spending limit) both mean sections of the Settings tab; they keep the names of tabs that folded into it, so a client that reads them keeps working.","title":"Tab","type":"string"}},"required":["tab","code","message"],"title":"PreflightIssueReadSchema","type":"object"},"PreflightStatus":{"description":"Outcome of the pre-flight resolve check for a hand-typed tenant workspace.","enum":["found","not_found","unreachable"],"title":"PreflightStatus","type":"string"},"PreparedColumnSchema":{"description":"The column a card created before anybody decided it.\n\nAdding a column and running it are one decision: the column lands the\nmoment the card appears, so the person can open it and see what they are\nbeing asked to pay for, and the card quotes the run alone. Dismissing the\ncard removes the column again.","properties":{"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The column the card runs, when the card added it. Null when the card runs a column that was already on the table and added only columns that read it.","title":"Column Id"},"dependent_column_ids":{"description":"Columns the same reply added that the run fills in after this one. Dismissing the card removes them too. Empty for most cards.","items":{"format":"uuid","type":"string"},"title":"Dependent Column Ids","type":"array"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","column_id"],"title":"PreparedColumnSchema","type":"object"},"PreviewComparisonContext":{"description":"Fingerprints of the inputs actually used, grouped for a readable comparison.","properties":{"context_fingerprints":{"additionalProperties":{"type":"string"},"title":"Context Fingerprints","type":"object"},"facts_offered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Facts Offered"},"setting_fingerprints":{"additionalProperties":{"type":"string"},"title":"Setting Fingerprints","type":"object"}},"required":["context_fingerprints","setting_fingerprints"],"title":"PreviewComparisonContext","type":"object"},"PricePer":{"description":"What a card's price is the price of: one call, or each day of what the call starts.\n\nCALL is nearly every card: the most approving it may spend, once. DAY is\na card that starts (or re-arms) a standing buy that goes on spending by\nitself, adding rows every day: its price is the most one day may cost,\nsaid \"up to 145 credits a day\", and Approve all keeps it out of the\none-off total it adds up. No tool starts one today.","enum":["call","day"],"title":"PricePer","type":"string"},"ProductCreditTierReadSchema":{"description":"One selectable credit volume of a product.","properties":{"annual_price_decimal":{"description":"The plan's FULL annual price at this volume, in cents.","title":"Annual Price Decimal","type":"string"},"credits":{"description":"The monthly credit allowance the tier grants.","title":"Credits","type":"integer"},"monthly_price_decimal":{"description":"The plan's FULL monthly price at this volume, in cents, flat platform fee included, not an increment over any base price.","title":"Monthly Price Decimal","type":"string"},"tier_key":{"description":"The tier key, e.g. 'team_tier_20k'.","title":"Tier Key","type":"string"}},"required":["tier_key","credits","monthly_price_decimal","annual_price_decimal"],"title":"ProductCreditTierReadSchema","type":"object"},"ProductRead":{"description":"Response schema for product information.","properties":{"credit_tiers":{"description":"The selectable credit volumes, cheapest first, each carrying the plan's full price at that volume. Empty for products with no self-serve price (Free, Enterprise), which is the whole of what they cost.","items":{"$ref":"#/components/schemas/ProductCreditTierReadSchema"},"title":"Credit Tiers","type":"array"},"data_retention":{"description":"Data retention period.","format":"duration","title":"Data Retention","type":"string"},"included_credits":{"description":"Credits included each period. For a tiered product this is the entry tier's allowance. The effective allowance comes from the selected tier.","title":"Included Credits","type":"integer"},"max_integrations":{"description":"Maximum number of integrations allowed. 0 means unlimited.","title":"Max Integrations","type":"integer"},"max_rows_per_table":{"description":"Maximum number of rows per table. 0 means unlimited.","title":"Max Rows Per Table","type":"integer"},"max_tables":{"description":"Maximum number of tables allowed. 0 means unlimited.","title":"Max Tables","type":"integer"},"name":{"description":"The product name.","title":"Name","type":"string"},"seats":{"description":"Number of seats included. 0 means unlimited.","title":"Seats","type":"integer"},"type":{"$ref":"#/components/schemas/ProductTier","description":"The product type."}},"required":["name","type","credit_tiers","max_integrations","included_credits","max_tables","max_rows_per_table","data_retention","seats"],"title":"ProductRead","type":"object"},"ProductTier":{"description":"The tier of a product in Stripe.\n\nDeclared cheapest-first. Free and Enterprise never touch Stripe: Free is\nfree, Enterprise is sales-led and has no self-serve price.\n\nA subscription's tier is recovered from its price's ``product_tier``\nmetadata, never by reverse-parsing a Stripe product name: a product is named\nfor the plan AND the credit volume it sells (\"Team Plan (10,000 credits)\"),\nso the name has not round-tripped to a tier since prices collapsed to one\nper plan+volume.","enum":["free_plan","team_plan","pro_plan","enterprise_plan"],"title":"ProductTier","type":"string"},"ProductsResponseSchema":{"description":"Response schema for listing available products.","properties":{"products":{"description":"List of available billing products.","items":{"$ref":"#/components/schemas/ProductRead"},"title":"Products","type":"array"}},"required":["products"],"title":"ProductsResponseSchema","type":"object"},"ProfileViewOutcome":{"additionalProperties":false,"description":"What a profile view saw: the common fields and the nine profile facts.\n\nThe view IS the action: LinkedIn records it server-side the moment the page\nrenders, so ``page_loaded`` is the verification and a view whose facts all\nread ``None`` is still a completed view. How long the browser lingered and\nhow far it scrolled are the driver's pacing, not facts about the member,\nand the row's own ``duration_ms`` already says how long the step took.","properties":{"already_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Connected"},"already_following":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Following"},"can_send_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Send Message"},"invitation_pending":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invitation Pending"},"kind":{"const":"profile_view","default":"profile_view","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"member_urns":{"items":{"maxLength":128,"type":"string"},"maxItems":8,"title":"Member Urns","type":"array"},"open_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Open Profile"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"profile_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Profile Resolved"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"vanity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity"}},"title":"ProfileViewOutcome","type":"object"},"ProfileViewParams":{"additionalProperties":false,"description":"Open a member's profile and read it like a person would. The navigation is the action.\n\n``profile_url`` is where the browser goes first. ``read_relationship`` asks\nthe browser to settle whether the member is connected or has our invitation\npending even where the action bar does not show it, by opening the member's\nown More menu and reading it: the look a connection request queues when its\nanswer cannot be told any other way.","properties":{"kind":{"const":"profile_view","default":"profile_view","title":"Kind","type":"string"},"profile_url":{"maxLength":512,"title":"Profile Url","type":"string"},"read_relationship":{"default":false,"title":"Read Relationship","type":"boolean"}},"required":["profile_url"],"title":"ProfileViewParams","type":"object"},"PromoteSourceFieldRequestSchema":{"description":"Which field to give its own column.","properties":{"display_name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"Column name.","title":"Display Name"},"path":{"description":"Dotted path into the object.","maxLength":500,"minLength":1,"title":"Path","type":"string"},"property_type":{"anyOf":[{"$ref":"#/components/schemas/PropertyType"},{"type":"null"}],"description":"Type to store; inferred from the sample when omitted."}},"required":["path"],"title":"PromoteSourceFieldRequestSchema","type":"object"},"PromoteSourceFieldResponseSchema":{"description":"The column that now reads the field.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"}},"required":["column_id"],"title":"PromoteSourceFieldResponseSchema","type":"object"},"PropertyKind":{"description":"Mode of a property. Used while creating/updating/deleting properties.\n\nAttributes:\n    BUILTIN: The property is a built-in property. E.g. \"$created_at\" or \"$email\" for PostHog.\n    CUSTOM: The property is a custom property. E.g. \"custom_property\" for PostHog.\n            Unknown properties are marked as CUSTOM.","enum":["builtin","custom"],"title":"PropertyKind","type":"string"},"PropertyListReason":{"description":"Why a property listing came back the way it did.","enum":["ok","no_properties_found"],"title":"PropertyListReason","type":"string"},"PropertyListResponseSchema":{"description":"Response model for listing properties.","properties":{"properties":{"description":"List of unique property names found in the integration","items":{"$ref":"#/components/schemas/PropertyReadSchema"},"title":"Properties","type":"array"},"reason":{"$ref":"#/components/schemas/PropertyListReason","description":"Reason for the result: 'ok' (properties available), or 'no_properties_found' (the integration exposes no property catalog)"},"total_count":{"description":"Total number of unique properties found","title":"Total Count","type":"integer"}},"required":["properties","total_count","reason"],"title":"PropertyListResponseSchema","type":"object"},"PropertyReadSchema":{"description":"Response model for a single property.","properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The tool's own display name for the property (HubSpot's 'Record ID' for hs_object_id), for showing to people. Null when the tool exposes none; `name` stays the key every read and write uses.","title":"Label"},"mode":{"$ref":"#/components/schemas/PropertyKind","description":"Property mode: builtin or custom"},"name":{"description":"The name of the property","title":"Name","type":"string"},"read_only":{"description":"Whether the property is read-only and cannot be used as a destination field","title":"Read Only","type":"boolean"},"type":{"$ref":"#/components/schemas/PropertyType","description":"The type of the property"}},"required":["name","type","mode","read_only"],"title":"PropertyReadSchema","type":"object"},"PropertyType":{"description":"Type of a property. Used while creating/updating/deleting properties.","enum":["string","integer","float","boolean","datetime","date","list","dict"],"title":"PropertyType","type":"string"},"ProposalDetailSchema":{"description":"The body of a card: what to read under the summary before approving.\n\n``kind`` says how to draw it. ``text`` is a block to read; ``diff`` is a\nbefore and an after to compare, which is how a prompt or an email being\nrewritten is shown, so nobody approves a rewrite they have not seen.\n\nA card about a lead search also carries the search: under a ``text``\ncard's text, or as the first lines of a ``diff``'s before and after. The\ntext then holds only what is not a filter.","properties":{"after":{"default":"","description":"What it would say, for a diff.","title":"After","type":"string"},"before":{"default":"","description":"What it says now, for a diff.","title":"Before","type":"string"},"kind":{"enum":["text","diff"],"title":"Kind","type":"string"},"landing":{"anyOf":[{"$ref":"#/components/schemas/CardLandingSchema"},{"type":"null"}],"description":"The table a lead search would make, for a card that makes one."},"search":{"anyOf":[{"$ref":"#/components/schemas/CardSearchSchema"},{"type":"null"}],"description":"The lead search whose filters the card lists, or the search after a diff."},"search_before":{"anyOf":[{"$ref":"#/components/schemas/CardSearchSchema"},{"type":"null"}],"description":"The lead search as it stands, for a diff that changes one."},"text":{"default":"","description":"The body, for a text card.","title":"Text","type":"string"}},"required":["kind"],"title":"ProposalDetailSchema","type":"object"},"ProposalKind":{"description":"How an approved card is carried out.\n\nVERB is F-15's eight hand-written workspace verbs: each has a spec in the\nregistry with its own apply, because applying one is real work rather than\na single request.\n\nTOOL is any route the assistant may call. An approval re-issues the request\nthe model asked for, through the same executor an MCP client would use, so\nthere is nothing to write per route and nothing to keep in step.","enum":["verb","tool"],"title":"ProposalKind","type":"string"},"ProposalOrigin":{"description":"Which surface raised a proposal.\n\nKept as its own enum rather than reusing the thread-store origins: a\nscheduled search proposes with no conversation behind it at all, and the\nactivity feed needs to say so.","enum":["chat","agent","scheduled_search","table_assistant"],"title":"ProposalOrigin","type":"string"},"ProposalReviewDTO":{"description":"Readable explanation and an explicitly illustrative outcome, never a scored run.","properties":{"changes":{"items":{"type":"string"},"maxItems":5,"title":"Changes","type":"array"},"example_after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Example After"},"example_before":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Example Before"},"example_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Example Label"},"summary":{"maxLength":500,"title":"Summary","type":"string"}},"required":["summary"],"title":"ProposalReviewDTO","type":"object"},"ProposalStatus":{"description":"Where one proposed action stands.\n\nPROPOSED waits on a person. APPLIED happened. DISMISSED is a person saying\nno. FAILED is an approval whose apply raised; the error stays with the row\nso the card can say why instead of vanishing.\n\nUNDONE is HISTORY ONLY. Nothing reaches it any more: undo was taken out\nwhile the assistant moved from eight hand-written verbs to any route it\nmay call, because reversing an arbitrary write is per-route work nobody\nhas done yet. The member stays because rows in this state were written\nbefore that, and a status the code cannot read is an activity feed that\nraises instead of loading.","enum":["proposed","applied","undone","dismissed","failed"],"title":"ProposalStatus","type":"string"},"ProviderCredentials":{"description":"Whose account an enrichment action's calls are billed to.\n\nLives here because it crosses the package boundary: the API layer renders\nit on every action, and `api` may read a domain's types but never its\ninternals.","enum":["platform","customer"],"title":"ProviderCredentials","type":"string"},"ProviderFailureResponseSchema":{"description":"A customer-safe refusal from the lead-search provider itself, not the request.\n\nEvery field here is written to be read on its own: the request was well\nformed and the filters were not the problem (see ``_as_provider_failure``,\nwhich builds this shape). Documented on the routes that raise it, so a\ngeneric 5xx handler can tell this apart from an unexpected server failure\nand relay it rather than hiding it.","properties":{"error_code":{"description":"Our own classification of the failure.","title":"Error Code","type":"string"},"filter_errors":{"description":"Every filter the provider complained about, in the order it named them.","items":{"$ref":"#/components/schemas/ProviderFilterErrorSchema"},"title":"Filter Errors","type":"array"},"message":{"description":"What went wrong, safe to show as-is.","title":"Message","type":"string"},"retryable":{"description":"Whether trying the same query again might succeed.","title":"Retryable","type":"boolean"}},"required":["message","error_code","retryable","filter_errors"],"title":"ProviderFailureResponseSchema","type":"object"},"ProviderFilterErrorSchema":{"description":"One provider complaint about the query, pinned to the filter it blames.","properties":{"filter":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Our name for the filter the provider blamed, so a client can pin this complaint to the input that caused it. Null when the complaint names no filter we recognise, e.g. a whole-query refusal.","title":"Filter"},"message":{"description":"What the provider said, safe to show as-is.","title":"Message","type":"string"}},"required":["filter","message"],"title":"ProviderFilterErrorSchema","type":"object"},"ProviderSettings":{"description":"Settings for an integration-provider enrichment action.\n\nA provider action's inputs are STRUCTURED (named fields the provider's\noperation declares: full name, company domain, …), not a prompt. Each\nbinding maps one declared input name to the column whose per-row value\nfeeds it. Required inputs without a binding block the save; bound-but-empty\nrequired inputs skip the row at run time, before any provider call.","properties":{"input_bindings":{"additionalProperties":{"format":"uuid","type":"string"},"description":"Declared operation input name → source column id.","maxProperties":10,"minProperties":1,"title":"Input Bindings","type":"object"},"kind":{"const":"provider","default":"provider","title":"Kind","type":"string"}},"required":["input_bindings"],"title":"ProviderSettings","type":"object"},"PushSummarySchema":{"description":"What one export column has pushed, counted by outcome.","properties":{"last_exported_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the newest push happened, or null if none ever did.","title":"Last Exported At"},"outcomes":{"additionalProperties":{"type":"integer"},"description":"Counts by receipt status: created, updated, pushed.","title":"Outcomes","type":"object"},"total":{"description":"Cells with a successful push on record.","title":"Total","type":"integer"}},"required":["outcomes","total","last_exported_at"],"title":"PushSummarySchema","type":"object"},"RangeFilterSchema":{"description":"An inclusive numeric range; either bound may be omitted.","properties":{"gte":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Gte"},"lte":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Lte"}},"title":"RangeFilterSchema","type":"object"},"RankScale":{"description":"The scale the three rank figures are reported and filtered on.\n\n``one_hundred`` is our default and not the vendor's (``one_thousand``):\na rank out of 100 is what every other backlink tool prints, and a filter\ntyped as \"domain rank 30 and up\" means 30 out of 100 to whoever types it.\nThe scale applies to the filters as well as the rows, so a stored search\nkeeps the scale it was written on.","enum":["one_hundred","one_thousand"],"title":"RankScale","type":"string"},"RateDraftSchema":{"description":"A thumb, not a scale: good or bad is all the loop needs.","properties":{"rating":{"$ref":"#/components/schemas/DraftRating"}},"required":["rating"],"title":"RateDraftSchema","type":"object"},"ReadConversationOutcome":{"additionalProperties":false,"description":"A full reading of one conversation, oldest message first.\n\nWhich thread this was is the step's own ``conversation_id``, on the same\nrow; the outcome does not repeat it, so there is no field a settlement\nwritten without a driver (expiry, restart, a navigation that never landed)\ncan forget. The read watermark only advances on a ``complete`` reading.","properties":{"complete":{"default":false,"title":"Complete","type":"boolean"},"kind":{"const":"read_conversation","default":"read_conversation","title":"Kind","type":"string"},"messages":{"items":{"$ref":"#/components/schemas/LinkedInMessageRead"},"maxItems":500,"title":"Messages","type":"array"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]}},"title":"ReadConversationOutcome","type":"object"},"ReadConversationParams":{"additionalProperties":false,"description":"Housekeeping: open one thread the scan flagged and read it in full.\n\n``conversation_id`` names our own row, which is where the reading lands.\n``conversation_urn`` is LinkedIn's name for the thread and is what the\nbrowser navigates to; a scan hit with no urn is never queued, because there\nis nothing to open. It is still optional for this release only because\nstored rows could not be checked before the deploy: it becomes required\nonce a pre-deploy check shows no read_conversation row without one, and\nuntil then every consumer keeps handling None. The member's own urn is not\ncarried: it already sits on the row this id names, and neither the browser\nnor the service ever read the copy.","properties":{"conversation_id":{"format":"uuid","title":"Conversation Id","type":"string"},"conversation_urn":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Conversation Urn"},"kind":{"const":"read_conversation","default":"read_conversation","title":"Kind","type":"string"},"replies_after":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only on the read right after a message: a reply is an inbound message LinkedIn dates after this moment, the last reading of the whole inbox. The thread's older history is no reply.","title":"Replies After"}},"required":["conversation_id"],"title":"ReadConversationParams","type":"object"},"RecordTypeVocabularyResponseSchema":{"description":"Response schema for the record-type vocabulary endpoint.","properties":{"record_types":{"description":"The global vocabulary of record types across all integrations, as display-ready options for the record-type filter on the list and directory. Includes a single 'Custom' entry when any integration accepts arbitrary record types.","items":{"$ref":"#/components/schemas/IntegrationRecordTypeReadSchema"},"title":"Record Types","type":"array"}},"required":["record_types"],"title":"RecordTypeVocabularyResponseSchema","type":"object"},"RecordTypesResponse":{"description":"Response model for List Integration Record Types endpoint.","properties":{"builtin_record_types":{"description":"Statically-known record types that always exist for this integration (e.g., ['customer', 'product'] for Stripe). Empty for integrations whose record types are entirely user-defined (e.g. databases).","items":{"type":"string"},"title":"Builtin Record Types","type":"array"},"custom_record_types":{"description":"Record types created on the integration side and discovered via its API (e.g. Attio custom objects, database tables). Empty when the integration has no custom record types or does not support discovering them.","items":{"type":"string"},"title":"Custom Record Types","type":"array"}},"required":["builtin_record_types","custom_record_types"],"title":"RecordTypesResponse","type":"object"},"ReferralClaimReadSchema":{"description":"The outcome of a claim.\n\nAlways 200. A code that does not apply (a reload, an existing customer\nclicking a colleague's link) reports ``attributed: false`` rather than an\nerror, because none of those are failures worth alarming a new user about.","properties":{"attributed":{"description":"Whether the code was recorded against this workspace.","title":"Attributed","type":"boolean"},"credits_on_upgrade":{"description":"Whole credits this workspace will receive when it starts a paid plan; 0 when nothing was attributed. Signing up pays nothing, so this is the promise the welcome message makes.","title":"Credits On Upgrade","type":"integer"},"referrer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The workspace that invited them, for the welcome message.","title":"Referrer Name"}},"required":["attributed","credits_on_upgrade","referrer_name"],"title":"ReferralClaimReadSchema","type":"object"},"ReferralClaimRequestSchema":{"description":"A referral code captured from the URL, offered up by a newly signed-up user.","properties":{"code":{"description":"The referral code as captured. Trimmed and normalized server-side.","maxLength":64,"minLength":1,"title":"Code","type":"string"},"source":{"anyOf":[{"maxLength":32,"type":"string"},{"type":"null"}],"description":"The affiliate's own tag for where the link was shared, banked at click time by the link redirect. Absent for a link followed any other way. Narrowed rather than validated server-side: an unrecognized value becomes untagged rather than failing a claim.","title":"Source"}},"required":["code"],"title":"ReferralClaimRequestSchema","type":"object"},"ReferralCountSchema":{"description":"How many referrals match the current filter.","properties":{"count":{"title":"Count","type":"integer"}},"required":["count"],"title":"ReferralCountSchema","type":"object"},"ReferralProgramReadSchema":{"description":"What the program pays. The public half of the referrals API.\n\nEverything else about a referral is workspace-private; these two numbers\nare the offer itself, and the person who most needs to read them (someone\non the signup page holding a friend's link) has no account yet.","properties":{"conversion_reward_credits":{"description":"Whole credits paid to BOTH sides when a referred workspace starts its first paid plan. Signing up pays nothing.","title":"Conversion Reward Credits","type":"integer"}},"required":["conversion_reward_credits"],"title":"ReferralProgramReadSchema","type":"object"},"ReferralReadSchema":{"description":"One row of the referral list.","properties":{"converted_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When they started their first paid plan; null while still on free.","title":"Converted At"},"credits_earned":{"description":"Credits this referral has earned the referrer, in decimal credits.","title":"Credits Earned","type":"number"},"email":{"title":"Email","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The referred person's display name, when known.","title":"Name"},"signed_up_at":{"description":"When they joined through the link.","format":"date-time","title":"Signed Up At","type":"string"},"status":{"$ref":"#/components/schemas/ReferralStatus"}},"required":["id","name","email","signed_up_at","converted_at","status","credits_earned"],"title":"ReferralReadSchema","type":"object"},"ReferralStatsSchema":{"description":"The three headline numbers on the referrals page.","properties":{"converted_count":{"description":"How many of them are on a paid plan.","title":"Converted Count","type":"integer"},"credits_earned":{"description":"Credits this workspace has been paid by the referral program, in decimal credits. Summed from payouts actually granted, so it never disagrees with the balance.","title":"Credits Earned","type":"number"},"signed_up_count":{"description":"How many friends have joined through the link, in total. Cumulative: it includes the ones who have since started paying.","title":"Signed Up Count","type":"integer"}},"required":["signed_up_count","converted_count","credits_earned"],"title":"ReferralStatsSchema","type":"object"},"ReferralStatus":{"description":"How far along one referral is: the list filter's vocabulary.\n\nDeliberately NOT Clay's \"lead\" / \"conversion\". This product has a Find\nLeads feature, so a referral labelled a lead reads as a sales prospect.","enum":["signed_up","converted"],"title":"ReferralStatus","type":"string"},"ReferralSummaryReadSchema":{"description":"Everything the referrals page needs before it lists anything.","properties":{"code":{"description":"The workspace's permanent referral code.","title":"Code","type":"string"},"conversion_reward_credits":{"description":"Whole credits paid to BOTH sides when a referred workspace starts its first paid plan. Signing up pays nothing.","title":"Conversion Reward Credits","type":"integer"},"link":{"description":"The full URL to share. Assembled server-side so the client never has to know which domain the program currently points at.","title":"Link","type":"string"},"stats":{"$ref":"#/components/schemas/ReferralStatsSchema"}},"required":["code","link","stats","conversion_reward_credits"],"title":"ReferralSummaryReadSchema","type":"object"},"RefreshMailboxStatusSchema":{"description":"Which mailboxes to re-check; omitted, every mailbox in the workspace.","properties":{"mailbox_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":500,"minItems":1,"type":"array"},{"type":"null"}],"title":"Mailbox Ids"}},"title":"RefreshMailboxStatusSchema","type":"object"},"RemovedStepLineSchema":{"description":"One sentence about the contacts on a removed step, as Review changes says it.","properties":{"line":{"title":"Line","type":"string"},"stops":{"description":"True when it says contacts stop, which reads as a warning.","title":"Stops","type":"boolean"}},"required":["line","stops"],"title":"RemovedStepLineSchema","type":"object"},"RemovedStepReviewSchema":{"description":"What a change does to the live contacts standing on one step it removes.","properties":{"finishing":{"description":"Contacts whose way in now leads to an end: they finish.","title":"Finishing","type":"integer"},"going_on":{"description":"Contacts who go on to the step their way in now leads to.","title":"Going On","type":"integer"},"lines":{"description":"The review's sentences for this step, in order: who stops, who goes on and where, who finishes. The AI Assistant's card says the same sentences.","items":{"$ref":"#/components/schemas/RemovedStepLineSchema"},"title":"Lines","type":"array"},"name":{"description":"The step's name, as its card named it.","title":"Name","type":"string"},"next_step":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Where those going on go, when it is one step for all of them.","title":"Next Step"},"step_id":{"format":"uuid","title":"Step Id","type":"string"},"stopped":{"description":"Contacts with no way in to follow, who stop.","title":"Stopped","type":"integer"}},"required":["step_id","name","stopped","going_on","finishing"],"title":"RemovedStepReviewSchema","type":"object"},"RenderedMessageReadSchema":{"properties":{"agent_written":{"default":false,"description":"The agent wrote this for the contact. A preview is one draft; the real send is written fresh, unless `approved`.","title":"Agent Written","type":"boolean"},"approved":{"default":false,"description":"The words were marked Looks good, with the contact's thread on the AI writing tab or as this one email from the Builder, and still stand, so they are what sends. They stop standing, and the agent writes the step fresh, once the agent's writing or the contact's row changes.","title":"Approved","type":"boolean"},"body":{"title":"Body","type":"string"},"closing":{"anyOf":[{"$ref":"#/components/schemas/EmailClosingReadSchema"},{"type":"null"}],"description":"What the send adds below these words, the sender's signature and then the opt-out footer, one blank line apart, so the email can be shown whole as the contact will get it. Set by the preview routes on an email step."},"in_thread":{"title":"In Thread","type":"boolean"},"is_sample":{"default":false,"title":"Is Sample","type":"boolean"},"message_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The agent's message these words are, on an agent-written step: the sample on screen, or the one marked Looks good. The looks-good route takes it back as `message_id`, so a mark lands only on the words that were read.","title":"Message Id"},"missing_columns":{"items":{"type":"string"},"title":"Missing Columns","type":"array"},"pinned":{"default":false,"description":"The words are pinned for this contact by a person (their own edit) or by the approval queue, and send exactly as they are. A thread marked Looks good is `approved` instead.","title":"Pinned","type":"boolean"},"sample_created_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Sample Created At"},"sample_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sample Version"},"sent":{"anyOf":[{"$ref":"#/components/schemas/SentStepEmailReadSchema"},{"type":"null"}],"description":"The email this step already got out to this contact, as it went, when one did: what they received, whoever wrote it, rather than the words above. Set by the preview route; null when the step has not reached them."},"spam_findings":{"description":"The spam check and the placeholder scan, run on the agent's words for this contact. Always empty for a written step, whose text the composer's own check covers. Advice, never a refusal.","items":{"$ref":"#/components/schemas/SpamFindingReadSchema"},"title":"Spam Findings","type":"array"},"subject":{"title":"Subject","type":"string"},"waiting_for_approval":{"default":false,"description":"This contact's message at this step waits for a person's approval on its Tasks card, where its words are changed, approved or rejected. Set by the preview route; false once the card is decided, or when the step never asked.","title":"Waiting For Approval","type":"boolean"},"written":{"default":true,"description":"False only when the preview was asked to write nothing and nothing is written for this contact at this step yet: subject and body are empty.","title":"Written","type":"boolean"}},"required":["subject","body","missing_columns","in_thread"],"title":"RenderedMessageReadSchema","type":"object"},"RepDataSettings":{"description":"Settings for the rep-data action: which part of the identity to return.","properties":{"field":{"default":"email_address","enum":["email_address","display_name","first_name","last_name","signature","all"],"title":"Field","type":"string"},"kind":{"const":"rep_data","default":"rep_data","title":"Kind","type":"string"}},"title":"RepDataSettings","type":"object"},"ReplyCompletionReadSchema":{"description":"The suggested continuation; empty means show nothing.","properties":{"completion":{"title":"Completion","type":"string"}},"required":["completion"],"title":"ReplyCompletionReadSchema","type":"object"},"ReplyState":{"description":"Whether the contact's latest reply has had an answer from us.\n\nA filter over the working inbox, where every conversation is one the\ncontact answered. REPLIED: an answer of ours went out after their latest\nreply, written by a person or by the agent. A LinkedIn reply queued for the\nbrowser counts once nothing waits on a person's approval for it (a person\nsent it, or its task was approved); one still waiting on Tasks, a failed\none and a forward to somebody else do not. NOT_REPLIED: their latest reply\nis still the last word. Only a genuine reply asks for an answer, so an\nauto-reply or a bounce arriving after our answer leaves a conversation\nREPLIED, and a thread whose only inbound mail is automatic is no\nconversation at all: the inbox does not list it, so neither state does.","enum":["replied","not_replied"],"title":"ReplyState","type":"string"},"ResearchFactCategory":{"description":"The kinds of fact a research brief may hold; anything else the opener found is dropped.","enum":["role","company","product","news","hiring","funding","technology","content","other"],"title":"ResearchFactCategory","type":"string"},"ResumeMailboxStopsResponseSchema":{"properties":{"resumed":{"description":"How many contacts their mailbox stopped were resumed.","title":"Resumed","type":"integer"}},"required":["resumed"],"title":"ResumeMailboxStopsResponseSchema","type":"object"},"ResumeOutOfOfficeResponseSchema":{"properties":{"resumed":{"title":"Resumed","type":"integer"}},"required":["resumed"],"title":"ResumeOutOfOfficeResponseSchema","type":"object"},"RetryInterruptedResponseSchema":{"properties":{"in_other_sequence":{"default":0,"description":"Failed contacts another live sequence has taken since. They stay failed here, on the step that broke, for a Retry once that sequence is done with them.","title":"In Other Sequence","type":"integer"},"retried":{"title":"Retried","type":"integer"}},"required":["retried"],"title":"RetryInterruptedResponseSchema","type":"object"},"RowsNotAddedSchema":{"description":"People a search found that did not become rows, and why.","properties":{"count":{"description":"How many people were found and not added.","title":"Count","type":"integer"},"reason":{"$ref":"#/components/schemas/NotAddedReason","description":"`found_twice`: the people search holds the same person under two records, and a table takes each person once. `already_in_table`: the person was already a row of the table, which was kept."}},"required":["count","reason"],"title":"RowsNotAddedSchema","type":"object"},"RunTableSourceRequestSchema":{"description":"What kind of refresh to run.\n\nTwo independent asks, not one dial. Re-fetching every record is safe and\nroutine; deleting local rows whose records are gone is destructive and\ndeliberate. Both default to off, so a plain refresh stays the cheap\nincremental one.","properties":{"delete_missing_rows":{"default":false,"description":"Delete imported rows whose records the source no longer returns. Implies a full re-list, and is refused while the source has a row limit: a capped import cannot tell a deleted record from one it never fetched.","title":"Delete Missing Rows","type":"boolean"},"full_relist":{"default":false,"description":"Re-fetch every record instead of only those changed since the last run. Updates rows; never deletes any.","title":"Full Relist","type":"boolean"}},"title":"RunTableSourceRequestSchema","type":"object"},"SampleRowsOrigin":{"description":"Where an agent's remembered example rows were found.","enum":["table","generated"],"title":"SampleRowsOrigin","type":"string"},"SampleRowsRequestSchema":{"description":"A request for example rows to fill the training grid with.","properties":{"count":{"default":5,"description":"How many examples to offer.","maximum":25.0,"minimum":1.0,"title":"Count","type":"integer"},"regenerate":{"default":false,"description":"Skip the agent's remembered examples and find fresh ones, replacing what was stored. What 'Suggest different examples' asks for; the default replays the set so training the same agent twice offers the same rows.","title":"Regenerate","type":"boolean"}},"title":"SampleRowsRequestSchema","type":"object"},"SampleRowsResponseSchema":{"description":"Example rows to fill the grid with, and where they came from.","properties":{"inputs_changed":{"default":false,"description":"A remembered set was discarded because the agent's inputs no longer matched it, so these are fresh.","title":"Inputs Changed","type":"boolean"},"origin":{"$ref":"#/components/schemas/SampleRowsOrigin","description":"How the values were found: read out of one of the org's own tables, or written by the model."},"remembered":{"default":false,"description":"These were replayed from the agent rather than found afresh.","title":"Remembered","type":"boolean"},"rows":{"description":"One set of input values per example, in offer order.","items":{"additionalProperties":{"maxLength":8000,"type":"string"},"propertyNames":{"maxLength":100,"minLength":1},"type":"object"},"title":"Rows","type":"array"},"table_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The table the values came from; null when they were generated.","title":"Table Name"}},"required":["rows","origin"],"title":"SampleRowsResponseSchema","type":"object"},"SaveLeadSearchRequestSchema":{"description":"A search worth keeping: the filters plus a name to find them by.","properties":{"backlinks":{"anyOf":[{"$ref":"#/components/schemas/BacklinksQuerySchema"},{"type":"null"}]},"companies":{"anyOf":[{"$ref":"#/components/schemas/CompanyQuerySchema"},{"type":"null"}]},"description":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Description"},"hiring_companies":{"anyOf":[{"$ref":"#/components/schemas/HiringCompaniesQuerySchema"},{"type":"null"}]},"local_businesses":{"anyOf":[{"$ref":"#/components/schemas/LocalBusinessQuerySchema"},{"type":"null"}]},"lookalikes":{"anyOf":[{"$ref":"#/components/schemas/LookalikeQuerySchema"},{"type":"null"}]},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"people":{"anyOf":[{"$ref":"#/components/schemas/PeopleQuerySchema"},{"type":"null"}]},"post_authors":{"anyOf":[{"$ref":"#/components/schemas/PostAuthorsQuerySchema"},{"type":"null"}]},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"row_limit":{"anyOf":[{"maximum":1000000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Rows to add each time the search runs. Clamped further by the organisation's plan cap; omit for the maximum.","title":"Row Limit"},"search_results":{"anyOf":[{"$ref":"#/components/schemas/SearchResultsQuerySchema"},{"type":"null"}]},"signal_companies":{"anyOf":[{"$ref":"#/components/schemas/SignalCompaniesQuerySchema"},{"type":"null"}]},"signal_people":{"anyOf":[{"$ref":"#/components/schemas/SignalPeopleQuerySchema"},{"type":"null"}]}},"required":["record_type","name"],"title":"SaveLeadSearchRequestSchema","type":"object"},"SavedAgentCreateSchema":{"description":"A new saved agent's full configuration.","properties":{"allow_fetch":{"default":true,"title":"Allow Fetch","type":"boolean"},"allow_find_email":{"default":false,"description":"Let runs buy a work email from the product's data suppliers, paid from the run's research budget. Refused when the supplier is not available to this organisation.","title":"Allow Find Email","type":"boolean"},"allow_linkedin_profile":{"default":false,"description":"Let runs read a LinkedIn profile through the product's data suppliers, paid from the run's research budget. Refused when the supplier is not available to this organisation.","title":"Allow Linkedin Profile","type":"boolean"},"allow_search":{"default":true,"title":"Allow Search","type":"boolean"},"description":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Description"},"effort":{"$ref":"#/components/schemas/AgentEffortLevel","default":"standard"},"icon":{"anyOf":[{"maxLength":16,"minLength":1,"type":"string"},{"type":"null"}],"title":"Icon"},"inputs":{"description":"The declared inputs, in the author's order.","items":{"$ref":"#/components/schemas/AgentInputSchema"},"maxItems":20,"title":"Inputs","type":"array"},"is_template":{"default":false,"description":"Save as a reusable starting point instead of a working agent. Templates are offered in the template gallery and never run.","title":"Is Template","type":"boolean"},"model_key":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"title":"Model Key"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"output_schema":{"anyOf":[{"discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Input","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Input"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}]},{"type":"null"}],"title":"Output Schema"},"prompt":{"$ref":"#/components/schemas/AgentPromptTemplate-Input"},"sample_rows":{"description":"Example input rows to remember for the Train screen: the `test_cases` the build flow just generated. Keyed by input name. Suggestion memory, not configuration: storing them never bumps the agent's version.","items":{"additionalProperties":{"type":"string"},"type":"object"},"maxItems":25,"title":"Sample Rows","type":"array"},"use_business_context":{"default":false,"title":"Use Business Context","type":"boolean"},"use_row_context":{"default":false,"title":"Use Row Context","type":"boolean"}},"required":["name"],"title":"SavedAgentCreateSchema","type":"object"},"SavedAgentFeedbackEntrySchema":{"description":"One person's verdict on one thing this agent produced.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"rating":{"$ref":"#/components/schemas/CellFeedbackRating"},"row_id":{"format":"uuid","title":"Row Id","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"table_name":{"title":"Table Name","type":"string"}},"required":["table_id","table_name","column_id","row_id","rating","comment","created_at"],"title":"SavedAgentFeedbackEntrySchema","type":"object"},"SavedAgentFeedbackResponseSchema":{"description":"What people thought of an agent's output, newest first.","properties":{"down_count":{"title":"Down Count","type":"integer"},"entries":{"items":{"$ref":"#/components/schemas/SavedAgentFeedbackEntrySchema"},"title":"Entries","type":"array"},"up_count":{"title":"Up Count","type":"integer"}},"required":["entries","up_count","down_count"],"title":"SavedAgentFeedbackResponseSchema","type":"object"},"SavedAgentGenerateRequestSchema":{"description":"A natural-language task to expand into a full agent draft.","properties":{"reference_material":{"anyOf":[{"maxLength":24000,"type":"string"},{"type":"null"}],"description":"Text from files the user attached to the builder, concatenated. Folded into prompt generation so the draft reflects their own rubric or guide.","title":"Reference Material"},"task_description":{"maxLength":4000,"minLength":1,"title":"Task Description","type":"string"}},"required":["task_description"],"title":"SavedAgentGenerateRequestSchema","type":"object"},"SavedAgentGeneratedDraftSchema":{"description":"The AI-built agent draft the editor seeds itself from.","properties":{"icon":{"title":"Icon","type":"string"},"inputs":{"description":"The inputs the generated prompt declares. The editor seeds its Inputs section from this, never by parsing the prompt.","items":{"$ref":"#/components/schemas/AgentInputSchema"},"title":"Inputs","type":"array"},"name":{"title":"Name","type":"string"},"output_schema":{"discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Output","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Output"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}],"title":"Output Schema"},"prompt":{"$ref":"#/components/schemas/AgentPromptTemplate-Output"},"test_cases":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"title":"Test Cases","type":"array"}},"required":["name","icon","prompt","inputs","output_schema","test_cases"],"title":"SavedAgentGeneratedDraftSchema","type":"object"},"SavedAgentGenerationStopResponseSchema":{"description":"A Stop was asked for. Whether it lands is the stream's to say.\n\nThe flag is cooperative and best effort: the build reads it before its\nnext model call, and a build that has already finished is not affected.\nThe stream reports the outcome as an `error` frame with reason `stopped`.","properties":{"generation_id":{"format":"uuid","title":"Generation Id","type":"string"}},"required":["generation_id"],"title":"SavedAgentGenerationStopResponseSchema","type":"object"},"SavedAgentInputGenerateRequestSchema":{"description":"A prompt to work out the per-row inputs of.","properties":{"inputs":{"items":{"$ref":"#/components/schemas/AgentInputSchema"},"maxItems":20,"title":"Inputs","type":"array"},"prompt":{"$ref":"#/components/schemas/AgentPromptTemplate-Input"}},"required":["prompt"],"title":"SavedAgentInputGenerateRequestSchema","type":"object"},"SavedAgentInputGenerateResponseSchema":{"description":"The declared inputs, and the prompt rewritten to reference them.","properties":{"inputs":{"description":"Every declared input after the pass: the ones already held, each keeping its id, plus any the prompt turned out to need.","items":{"$ref":"#/components/schemas/AgentInputSchema"},"title":"Inputs","type":"array"},"prompt":{"$ref":"#/components/schemas/AgentPromptTemplate-Output"},"summary":{"title":"Summary","type":"string"}},"required":["prompt","inputs","summary"],"title":"SavedAgentInputGenerateResponseSchema","type":"object"},"SavedAgentListResponseSchema":{"description":"The organisation's saved agents, alphabetical.","properties":{"saved_agents":{"items":{"$ref":"#/components/schemas/SavedAgentReadSchema"},"title":"Saved Agents","type":"array"}},"required":["saved_agents"],"title":"SavedAgentListResponseSchema","type":"object"},"SavedAgentOutputGenerateRequestSchema":{"description":"A prompt to derive an output schema from.","properties":{"inputs":{"items":{"$ref":"#/components/schemas/AgentInputSchema"},"maxItems":20,"title":"Inputs","type":"array"},"prompt":{"$ref":"#/components/schemas/AgentPromptTemplate-Input"}},"required":["prompt"],"title":"SavedAgentOutputGenerateRequestSchema","type":"object"},"SavedAgentOutputGenerateResponseSchema":{"description":"The generated output schema, ready to drop into the editor.","properties":{"output_schema":{"discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Output","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Output"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}],"title":"Output Schema"}},"required":["output_schema"],"title":"SavedAgentOutputGenerateResponseSchema","type":"object"},"SavedAgentPromptEditRequestSchema":{"description":"A natural-language change to make to an existing agent prompt.","properties":{"current_prompt":{"$ref":"#/components/schemas/AgentPromptTemplate-Input"},"inputs":{"items":{"$ref":"#/components/schemas/AgentInputSchema"},"maxItems":20,"title":"Inputs","type":"array"},"instruction":{"maxLength":4000,"minLength":1,"title":"Instruction","type":"string"},"saved_agent_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Revise in the light of what people said was wrong with this agent's real results. The complaints are read server-side from stored feedback, so the client cannot put words in their mouths.","title":"Saved Agent Id"}},"required":["current_prompt","instruction"],"title":"SavedAgentPromptEditRequestSchema","type":"object"},"SavedAgentPromptEditResponseSchema":{"description":"The revised prompt and a one-line account of what changed.","properties":{"inputs":{"description":"The declared inputs after the edit; a revision may mint one.","items":{"$ref":"#/components/schemas/AgentInputSchema"},"title":"Inputs","type":"array"},"prompt":{"$ref":"#/components/schemas/AgentPromptTemplate-Output"},"summary":{"title":"Summary","type":"string"}},"required":["prompt","inputs","summary"],"title":"SavedAgentPromptEditResponseSchema","type":"object"},"SavedAgentPromptEditStopResponseSchema":{"description":"A Stop was asked for. Whether it lands is the stream's to say.\n\nCooperative and best effort: the revision reads the flag once a second\nwhile the model writes and again before the prompt is handed back, and a\nrevision that has already landed is not affected. The stream reports the\noutcome as an `error` frame with reason `stopped`.","properties":{"edit_id":{"format":"uuid","title":"Edit Id","type":"string"}},"required":["edit_id"],"title":"SavedAgentPromptEditStopResponseSchema","type":"object"},"SavedAgentReadSchema":{"description":"One org-level saved agent as the editor, picker and library render it.","properties":{"allow_fetch":{"title":"Allow Fetch","type":"boolean"},"allow_find_email":{"default":false,"description":"Whether a run may buy a work email from the product's data suppliers while it researches, paid from the run's research budget.","title":"Allow Find Email","type":"boolean"},"allow_linkedin_profile":{"default":false,"description":"Whether a run may read a LinkedIn profile through the product's data suppliers while it researches, paid from the run's research budget.","title":"Allow Linkedin Profile","type":"boolean"},"allow_search":{"title":"Allow Search","type":"boolean"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"current_version":{"title":"Current Version","type":"integer"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"effort":{"$ref":"#/components/schemas/AgentEffortLevel"},"favorite":{"description":"Whether the person asking starred this agent. A star is one person's own, so a teammate's list differs; always false for an API key.","title":"Favorite","type":"boolean"},"granted_verbs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"The workspace actions this agent may apply without asking, as verb keys (see GET /assistant/verbs/). Null means the workspace defaults apply. The agent's table runs take an allowed action themselves, without a card.","title":"Granted Verbs"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"id":{"format":"uuid","title":"Id","type":"string"},"inputs":{"items":{"$ref":"#/components/schemas/AgentInputSchema"},"title":"Inputs","type":"array"},"is_template":{"default":false,"title":"Is Template","type":"boolean"},"last_viewed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the person asking last opened this agent; null when they never have, and always for an API key.","title":"Last Viewed At"},"model_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Key"},"name":{"title":"Name","type":"string"},"output_schema":{"anyOf":[{"discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Output","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Output"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}]},{"type":"null"}],"title":"Output Schema"},"owner_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Display Name"},"owner_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner User Id"},"prompt":{"$ref":"#/components/schemas/AgentPromptTemplate-Output"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"use_business_context":{"title":"Use Business Context","type":"boolean"},"use_row_context":{"title":"Use Row Context","type":"boolean"}},"required":["id","name","description","effort","created_at","updated_at","prompt","inputs","output_schema","model_key","allow_search","allow_fetch","use_business_context","use_row_context","owner_user_id","favorite","icon","current_version"],"title":"SavedAgentReadSchema","type":"object"},"SavedAgentUpdateSchema":{"description":"A partial saved-agent update; absent fields keep their value.","properties":{"allow_fetch":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Fetch"},"allow_find_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Switch the work-email tool on or off; switching it on is refused when the supplier is not available to this organisation.","title":"Allow Find Email"},"allow_linkedin_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Switch the LinkedIn-profile tool on or off; switching it on is refused when the supplier is not available to this organisation.","title":"Allow Linkedin Profile"},"allow_search":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Search"},"description":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"title":"Description"},"effort":{"anyOf":[{"$ref":"#/components/schemas/AgentEffortLevel"},{"type":"null"}]},"favorite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Star the agent for the person asking, or unstar it. A star is one person's own and never versions; refused from an API key, which has no person.","title":"Favorite"},"granted_verbs":{"anyOf":[{"items":{"type":"string"},"maxItems":8,"type":"array"},{"type":"null"}],"description":"The workspace actions the agent may apply without asking, as verb keys (see GET /assistant/verbs/). Send null to fall back to the workspace defaults; an empty list switches every action off. A send is refused. The agent's table runs take an allowed action themselves, without a card.","title":"Granted Verbs"},"icon":{"anyOf":[{"maxLength":16,"minLength":1,"type":"string"},{"type":"null"}],"title":"Icon"},"inputs":{"anyOf":[{"items":{"$ref":"#/components/schemas/AgentInputSchema"},"maxItems":20,"type":"array"},{"type":"null"}],"title":"Inputs"},"model_key":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"title":"Model Key"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"title":"Name"},"output_schema":{"anyOf":[{"discriminator":{"mapping":{"fields":"#/components/schemas/EnrichmentOutputFields-Input","json_schema":"#/components/schemas/EnrichmentOutputRawSchema"},"propertyName":"mode"},"oneOf":[{"$ref":"#/components/schemas/EnrichmentOutputFields-Input"},{"$ref":"#/components/schemas/EnrichmentOutputRawSchema"}]},{"type":"null"}],"title":"Output Schema"},"prompt":{"anyOf":[{"$ref":"#/components/schemas/AgentPromptTemplate-Input"},{"type":"null"}]},"use_business_context":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Business Context"},"use_row_context":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Row Context"}},"title":"SavedAgentUpdateSchema","type":"object"},"SavedAgentUsageEntrySchema":{"description":"One table column a saved agent is deployed on.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"column_name":{"title":"Column Name","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"table_name":{"title":"Table Name","type":"string"}},"required":["table_id","table_name","column_id","column_name"],"title":"SavedAgentUsageEntrySchema","type":"object"},"SavedAgentUsageResponseSchema":{"description":"Where a saved agent is used: the columns linked to it, across tables.","properties":{"entries":{"items":{"$ref":"#/components/schemas/SavedAgentUsageEntrySchema"},"title":"Entries","type":"array"},"table_count":{"title":"Table Count","type":"integer"}},"required":["entries","table_count"],"title":"SavedAgentUsageResponseSchema","type":"object"},"SavedAgentUserPrefsReadSchema":{"description":"The asking person's own star and last open of one saved agent.","properties":{"favorite":{"description":"Whether this person starred the agent.","title":"Favorite","type":"boolean"},"last_viewed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this person last opened the agent; null means never.","title":"Last Viewed At"}},"required":["favorite","last_viewed_at"],"title":"SavedAgentUserPrefsReadSchema","type":"object"},"SavedAgentVersionListResponseSchema":{"description":"An agent's version history, newest first.","properties":{"versions":{"items":{"$ref":"#/components/schemas/SavedAgentVersionReadSchema"},"title":"Versions","type":"array"}},"required":["versions"],"title":"SavedAgentVersionListResponseSchema","type":"object"},"SavedAgentVersionReadSchema":{"description":"One entry of an agent's version history.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"is_current":{"title":"Is Current","type":"boolean"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What the agent was called at this version.","title":"Name"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt as it stood at this version, FLATTENED to wire text for the read-only history and diff views. Deliberately a string, since history is read and compared, never edited.","title":"Prompt"},"version":{"title":"Version","type":"integer"}},"required":["version","created_at","is_current"],"title":"SavedAgentVersionReadSchema","type":"object"},"SavedLeadSearchListResponseSchema":{"description":"Saved searches, most recently used first.","properties":{"searches":{"items":{"$ref":"#/components/schemas/SavedLeadSearchResponseSchema"},"title":"Searches","type":"array"}},"required":["searches"],"title":"SavedLeadSearchListResponseSchema","type":"object"},"SavedLeadSearchResponseSchema":{"description":"A saved search, in the request's own shape for lossless rehydration.","properties":{"ai_made":{"default":false,"description":"Whether the AI Assistant saved this search through a granted action. Saved by is still the person who approved it.","title":"Ai Made","type":"boolean"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"created_by_user_id":{"title":"Created By User Id","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"format":"uuid","title":"Id","type":"string"},"last_used_at":{"format":"date-time","title":"Last Used At","type":"string"},"name":{"title":"Name","type":"string"},"query":{"additionalProperties":true,"title":"Query","type":"object"},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Limit"}},"required":["id","name","description","record_type","query","row_limit","created_by_user_id","last_used_at","created_at"],"title":"SavedLeadSearchResponseSchema","type":"object"},"SavedViewCreateSchema":{"properties":{"filters":{"additionalProperties":true,"maxProperties":50,"title":"Filters","type":"object"},"name":{"maxLength":64,"minLength":1,"title":"Name","type":"string"}},"required":["name","filters"],"title":"SavedViewCreateSchema","type":"object"},"SavedViewReadSchema":{"description":"A named set of inbox filters.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"created_by_email":{"title":"Created By Email","type":"string"},"filters":{"additionalProperties":true,"title":"Filters","type":"object"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","filters","created_by_email","created_at","updated_at"],"title":"SavedViewReadSchema","type":"object"},"SavedViewUpdateSchema":{"description":"R7 partial update: rename, repoint at new filters, or both.\n\nBoth fields optional and independent, so \"rename this\" and \"make this match\nwhat I am looking at now\" are the same endpoint without either overwriting\nthe other with a stale value.","properties":{"filters":{"anyOf":[{"additionalProperties":true,"maxProperties":50,"type":"object"},{"type":"null"}],"title":"Filters"},"name":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"title":"Name"}},"title":"SavedViewUpdateSchema","type":"object"},"SearchResultsQuerySchema":{"description":"Google searches to run, each landing the results Google shows for it.\n\nWrite each search the way you would type it into Google: operators\n(site:, intitle:, quoted phrases) work and cost nothing extra. One row is\none result of one search, with the search that found it and its rank.","properties":{"country":{"default":"US","description":"The country the searches run from, as a two-letter ISO code (US, GB, DE). Google ranks results for searchers there. US by default.","maxLength":2,"minLength":2,"title":"Country","type":"string"},"results_per_search":{"default":50,"description":"The most results each search adds. A search stops there or where Google runs out of results, whichever comes first. 50 by default.","maximum":300.0,"minimum":10.0,"title":"Results Per Search","type":"integer"},"searches":{"description":"The searches to run, one per entry, exactly as you would type them into Google. Blank entries and repeats are dropped. At most 100 searches.","items":{"maxLength":500,"type":"string"},"maxItems":100,"title":"Searches","type":"array"}},"title":"SearchResultsQuerySchema","type":"object"},"SegmentKind":{"description":"One piece of a subject or body template.","enum":["text","column","builtin","spintax"],"title":"SegmentKind","type":"string"},"SelectChoice":{"description":"One option of a select or multi-select column.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A column colour token; None renders the neutral chip.","title":"Color"},"value":{"maxLength":255,"minLength":1,"title":"Value","type":"string"}},"required":["value"],"title":"SelectChoice","type":"object"},"SelectOptions":{"description":"Options for a single-select column.","properties":{"choices":{"items":{"$ref":"#/components/schemas/SelectChoice"},"title":"Choices","type":"array"},"type":{"const":"select","default":"select","title":"Type","type":"string"}},"title":"SelectOptions","type":"object"},"SendMessageOutcome":{"additionalProperties":false,"description":"What sending a message produced: the common fields, the profile facts and the thread.\n\n``conversation_urn`` is read off the opened composer when LinkedIn exposes\nit, which is the first moment a brand-new thread has an id at all. A reply\ninto an existing thread happens on the messaging page, where there is no\nprofile to read, so the profile facts stay ``None`` there and\n``member_urn`` is the one the step was given; settlement falls back to the\nparams' urn for a reply that already knew its thread.","properties":{"already_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Connected"},"already_following":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Following"},"can_send_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Send Message"},"conversation_urn":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Conversation Urn"},"found_already":{"anyOf":[{"$ref":"#/components/schemas/LinkedInFoundAlready"},{"type":"null"}]},"invitation_pending":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invitation Pending"},"kind":{"const":"send_message","default":"send_message","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"member_urns":{"items":{"maxLength":128,"type":"string"},"maxItems":8,"title":"Member Urns","type":"array"},"open_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Open Profile"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"profile_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Profile Resolved"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"vanity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity"}},"title":"SendMessageOutcome","type":"object"},"SendMessageParams":{"additionalProperties":false,"description":"Send a direct message, either from a profile or into an existing thread.\n\nTwo producers disagree about where a message goes, and both are right: a\nsequence step knows only the contact's profile, while a reply from the\nOneprofile inbox knows the thread and not the profile. Rather than make\nevery field optional and hope, the validator requires at least one usable\ntarget. ``member_urn`` travels with a thread reply because the messaging\npage shows no profile to read it off; the browser hands it back unchanged\nas the outcome's ``member_urn``, which is what the conversation row is\nkeyed on.\n\n``body_original_length`` follows the rule ``note_original_length`` sets on\na connection request: the body was cut exactly when it is longer than\n``body``.","properties":{"body":{"maxLength":8000,"title":"Body","type":"string"},"body_original_length":{"default":0,"minimum":0.0,"title":"Body Original Length","type":"integer"},"conversation_urn":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Conversation Urn"},"kind":{"const":"send_message","default":"send_message","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"profile_url":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"title":"Profile Url"}},"required":["body"],"title":"SendMessageParams","type":"object"},"SendToTableSettings":{"description":"Settings for the send-to-table action: where the row goes.","properties":{"kind":{"const":"send_to_table","default":"send_to_table","title":"Kind","type":"string"},"table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The table each row is appended to.","title":"Table Id"},"target_column":{"default":"","description":"The column in that table this row's value is written to.","maxLength":255,"title":"Target Column","type":"string"}},"title":"SendToTableSettings","type":"object"},"SenderLeaderboardReadSchema":{"properties":{"linkedin_rows":{"default":[],"items":{"$ref":"#/components/schemas/LinkedInSenderLeaderboardRowReadSchema"},"title":"Linkedin Rows","type":"array"},"refreshed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Refreshed At"},"refreshing":{"default":false,"description":"True when the board was more than five minutes old and a refresh is running in the background. Read it again a few seconds later for newer numbers and a newer refreshed_at.","title":"Refreshing","type":"boolean"},"rows":{"items":{"$ref":"#/components/schemas/SenderLeaderboardRowReadSchema"},"title":"Rows","type":"array"}},"required":["rows","refreshed_at"],"title":"SenderLeaderboardReadSchema","type":"object"},"SenderLeaderboardRowReadSchema":{"properties":{"bounce_rate":{"title":"Bounce Rate","type":"number"},"bounces":{"title":"Bounces","type":"integer"},"contacted":{"default":0,"title":"Contacted","type":"integer"},"mailbox_email":{"title":"Mailbox Email","type":"string"},"mailbox_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Mailbox Id"},"opt_outs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Opt Outs"},"positive":{"default":0,"title":"Positive","type":"integer"},"replies":{"title":"Replies","type":"integer"},"reply_rate":{"title":"Reply Rate","type":"number"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sender Profile Id"},"sender_profile_name":{"title":"Sender Profile Name","type":"string"},"sent":{"title":"Sent","type":"integer"}},"required":["sender_profile_id","sender_profile_name","mailbox_id","mailbox_email","sent","replies","bounces","reply_rate","bounce_rate"],"title":"SenderLeaderboardRowReadSchema","type":"object"},"SenderLinkedInUsageSchema":{"description":"Today's LinkedIn steps of one kind against its daily limit.","properties":{"daily_limit":{"title":"Daily Limit","type":"integer"},"kind":{"$ref":"#/components/schemas/LinkedInActionKind"},"used_today":{"title":"Used Today","type":"integer"}},"required":["kind","used_today","daily_limit"],"title":"SenderLinkedInUsageSchema","type":"object"},"SenderProfileBulkUpdateResponseSchema":{"properties":{"updated":{"title":"Updated","type":"integer"}},"required":["updated"],"title":"SenderProfileBulkUpdateResponseSchema","type":"object"},"SenderProfileBulkUpdateSchema":{"description":"One edit applied to many senders: the Senders list's bulk action.\n\nA field omitted from the request is left unchanged on every sender; a\nfield sent explicitly (even as an empty string) is applied to all of them.","properties":{"first_name":{"anyOf":[{"maxLength":128,"type":"string"},{}],"title":"First Name"},"last_name":{"anyOf":[{"maxLength":128,"type":"string"},{}],"title":"Last Name"},"profile_ids":{"items":{"format":"uuid","type":"string"},"maxItems":500,"minItems":1,"title":"Profile Ids","type":"array"},"signature_text":{"anyOf":[{"type":"string"},{}],"description":"Plain-text signature appended to every send.","title":"Signature Text"}},"required":["profile_ids"],"title":"SenderProfileBulkUpdateSchema","type":"object"},"SenderProfileCreateSchema":{"description":"A sender is a person, so a person's name is all it takes to create one.\n\nThe workspace-unique display name is derived from these two. There is no\nseparate name to type, and therefore no way for it to disagree with the\nfirst and last name the messages themselves are signed with.","properties":{"first_name":{"description":"The sender's first name.","maxLength":128,"minLength":1,"title":"First Name","type":"string"},"last_name":{"default":"","description":"The sender's last name.","maxLength":128,"title":"Last Name","type":"string"},"signature_text":{"default":"","description":"Plain-text signature appended to every send as this profile.","title":"Signature Text","type":"string"},"timezone":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"The creating browser's IANA timezone, kept as a guess that only a person changes after. One this server does not know is dropped.","title":"Timezone"}},"required":["first_name"],"title":"SenderProfileCreateSchema","type":"object"},"SenderProfileReadSchema":{"properties":{"booking_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The link people use to book a meeting with this sender, such as a Calendly or Cal.com page. It is what the {{Sender booking link}} variable is replaced with. Null when none is set.","title":"Booking Url"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"daily_limit":{"default":0,"title":"Daily Limit","type":"integer"},"email_approval_mode":{"anyOf":[{"$ref":"#/components/schemas/EmailApprovalMode"},{"type":"null"}],"description":"manual | auto; null inherits the workspace's email approval mode."},"first_name":{"default":"","title":"First Name","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"last_name":{"default":"","title":"Last Name","type":"string"},"linkedin_checkpoint":{"default":false,"description":"True while LinkedIn is asking this sender to verify the account.","title":"Linkedin Checkpoint","type":"boolean"},"linkedin_connection_request_cap":{"default":0,"title":"Linkedin Connection Request Cap","type":"integer"},"linkedin_connection_requests_today":{"default":0,"title":"Linkedin Connection Requests Today","type":"integer"},"linkedin_identity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Identity"},"linkedin_last_seen_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a browser for this sender last checked in.","title":"Linkedin Last Seen At"},"linkedin_photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Photo Url"},"linkedin_presence":{"anyOf":[{"$ref":"#/components/schemas/LinkedInPresence"},{"type":"null"}]},"linkedin_run_mode":{"anyOf":[{"$ref":"#/components/schemas/LinkedInApprovalMode"},{"type":"null"}],"description":"The sender's LinkedIn approval setting in force: manual (a person approves each step on Tasks before it runs) or auto. Null when no LinkedIn account is connected."},"linkedin_usage":{"description":"Today's LinkedIn steps against each kind's daily limit.","items":{"$ref":"#/components/schemas/SenderLinkedInUsageSchema"},"title":"Linkedin Usage","type":"array"},"mailbox_count":{"title":"Mailbox Count","type":"integer"},"name":{"title":"Name","type":"string"},"send_mode":{"$ref":"#/components/schemas/SenderSendMode","description":"Whether the messages the agent writes for this sender go out on their own or wait for a person, replies included. Always send (`always_send`): the agent's messages go out on their own unless something is wrong with the words. Send when confident (`send_when_confident`, the default): they go out when the agent was confident and nothing is wrong, and wait for a person otherwise. Always ask (`always_ask`): a person approves every one. A sequence set to ask first still asks, whichever mode its senders are on."},"sent_today":{"default":0,"title":"Sent Today","type":"integer"},"signature_text":{"default":"","title":"Signature Text","type":"string"},"status":{"$ref":"#/components/schemas/SenderProfileStatus"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The sender's IANA timezone, such as America/New_York. Their daily limits reset at its midnight, and a sequence sending in each sender's timezone sends in its hours. Null until it is detected or chosen.","title":"Timezone"},"timezone_source":{"anyOf":[{"$ref":"#/components/schemas/TimezoneSource"},{"type":"null"}],"description":"Where the timezone came from: `guessed` from whoever created the sender or the sequences it sent for, `browser` from the browser driving the sender's LinkedIn when the sender had none, `person` chosen by someone. Detection only fills an empty timezone and never moves one a sender has."},"title":{"description":"The sender's job title, as their messages introduce them. It is what the {{Sender title}} variable is replaced with. Empty when none is set.","title":"Title","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","status","mailbox_count","send_mode","title","booking_url","created_at","updated_at"],"title":"SenderProfileReadSchema","type":"object"},"SenderProfileStatus":{"description":"Lifecycle of a sender.\n\nA sender is DRAFT from the moment it is created and becomes ACTIVE once at\nleast one mailbox is attached. The status is derived from attachment, never\nstored, so it cannot drift.","enum":["draft","active"],"title":"SenderProfileStatus","type":"string"},"SenderProfileUpdateSchema":{"description":"A field omitted from the request is left unchanged.","properties":{"booking_url":{"anyOf":[{"maxLength":2048,"type":"string"},{},{"type":"null"}],"description":"The link people use to book a meeting with this sender. It has to be a full web address starting with http:// or https://. Null or an empty string removes it. Only a person signed in to Oneprofile can change it.","title":"Booking Url"},"confirm":{"default":false,"description":"Set to true to confirm that this sender's messages may go out without anyone reading them first. Required when `send_mode` is `always_send`; ignored otherwise.","title":"Confirm","type":"boolean"},"email_approval_mode":{"anyOf":[{"$ref":"#/components/schemas/EmailApprovalMode"},{},{"type":"null"}],"description":"manual | auto to override the workspace's email approval mode for this sender; null to inherit it again. Only a person signed in to Oneprofile can change it; an API key cannot.","title":"Email Approval Mode"},"first_name":{"anyOf":[{"maxLength":128,"minLength":1,"type":"string"},{}],"title":"First Name"},"last_name":{"anyOf":[{"maxLength":128,"type":"string"},{}],"title":"Last Name"},"send_mode":{"anyOf":[{"$ref":"#/components/schemas/SenderSendMode"},{}],"description":"Whether the messages the agent writes for this sender go out on their own or wait for a person, replies included. Always send (`always_send`): the agent's messages go out on their own unless something is wrong with the words. Send when confident (`send_when_confident`, the default): they go out when the agent was confident and nothing is wrong, and wait for a person otherwise. Always ask (`always_ask`): a person approves every one. A sequence set to ask first still asks, whichever mode its senders are on. Only a person signed in to Oneprofile can change it; an API key can read it but not change it. Only a workspace admin can choose Always send, and only with `confirm` set to true. Moving to Send when confident or Always ask needs neither. Leave it out of the request unless you are changing it.","title":"Send Mode"},"signature_text":{"anyOf":[{"type":"string"},{}],"description":"Plain-text signature appended to every send.","title":"Signature Text"},"timezone":{"anyOf":[{"type":"string"},{},{"type":"null"}],"description":"The sender's IANA timezone, such as America/New_York, as a person chooses it: their daily limits reset at its midnight and sequences send in its hours. Once chosen, nothing detected replaces it. Null returns the sender to the detected zone. Sending the zone it already has changes nothing.","title":"Timezone"},"title":{"anyOf":[{"maxLength":120,"type":"string"},{}],"description":"The sender's job title, one line of up to 120 characters, as their messages introduce them. An empty string removes it. Only a person signed in to Oneprofile can change it.","title":"Title"}},"title":"SenderProfileUpdateSchema","type":"object"},"SenderSendMode":{"description":"How much of this sender's agent-written email leaves without a person.\n\n``ALWAYS_SEND``: agent-written email steps and replies go out unattended\nunless a defect is found in the message itself. ``SEND_WHEN_CONFIDENT``:\nthey go out when the agent's confidence rule holds, and a person is asked\nwhen it does not. ``ALWAYS_ASK``: every agent-written email waits for a\nperson, whatever the agent thinks of it.\n\nThe three are ordered by strictness (ALWAYS_ASK strictest, then\nSEND_WHEN_CONFIDENT, then ALWAYS_SEND loosest), and that order is what\n``service.strictest_send_mode`` folds a cadence's assigned senders down\nwith. The order is the point: everything that combines two modes must\nresolve towards asking, never towards sending.\n\nReplaces ``EmailApprovalMode``'s two-way choice, which cannot express\n\"send the ones the agent stands behind\". That enum and its column stay\nuntil a release backfills this one; do not read both in one decision.","enum":["always_send","send_when_confident","always_ask"],"title":"SenderSendMode","type":"string"},"SendingDaysSchema":{"additionalProperties":false,"description":"The days a sequence may send on. A day left out, or null, is closed.","properties":{"fri":{"anyOf":[{"$ref":"#/components/schemas/SendingHoursSchema"},{"type":"null"}]},"mon":{"anyOf":[{"$ref":"#/components/schemas/SendingHoursSchema"},{"type":"null"}]},"sat":{"anyOf":[{"$ref":"#/components/schemas/SendingHoursSchema"},{"type":"null"}]},"sun":{"anyOf":[{"$ref":"#/components/schemas/SendingHoursSchema"},{"type":"null"}]},"thu":{"anyOf":[{"$ref":"#/components/schemas/SendingHoursSchema"},{"type":"null"}]},"tue":{"anyOf":[{"$ref":"#/components/schemas/SendingHoursSchema"},{"type":"null"}]},"wed":{"anyOf":[{"$ref":"#/components/schemas/SendingHoursSchema"},{"type":"null"}]}},"title":"SendingDaysSchema","type":"object"},"SendingHoursSchema":{"additionalProperties":false,"description":"One open day's sending hours, read on the window's timezone.","properties":{"end":{"description":"When it closes, as HH:MM, after start on the same day. Hours cannot run past midnight, so 23:59 is the latest close.","maxLength":16,"minLength":1,"title":"End","type":"string"},"start":{"description":"When sending opens, as HH:MM on a 24-hour clock, such as 09:00.","maxLength":16,"minLength":1,"title":"Start","type":"string"}},"required":["start","end"],"title":"SendingHoursSchema","type":"object"},"SendingWindowProblemSchema":{"description":"A rule the saved sending window breaks, and where.","properties":{"field":{"description":"Where in sending_window it is, as its keys spell it: ['timezone'], ['days'], ['days', 'mon'], ['days', 'mon', 'start'] or ['min_interval_minutes']; empty when the window as a whole cannot be read.","items":{"type":"string"},"title":"Field","type":"array"},"message":{"description":"What is wrong and what to change, in the product's words.","title":"Message","type":"string"}},"required":["field","message"],"title":"SendingWindowProblemSchema","type":"object"},"SendingWindowSchema":{"additionalProperties":false,"description":"When a sequence may send, as the send engine reads it.\n\nWithout ``days`` it sends at any hour of any day, which is the settings\npage's Send any time: it keeps its timezone and its minimum gap between\nemails. Every rule here is checked on save, running or not, and a window\nthat breaks one is refused with a 422 naming the part at fault.","properties":{"days":{"anyOf":[{"$ref":"#/components/schemas/SendingDaysSchema"},{"type":"null"}],"description":"The days it may send on, each with its hours. Leave it out to send at any hour; given, at least one day must be open."},"min_interval_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The shortest gap between two emails from one mailbox, a whole number from 0 to 240 minutes. Null or 0 spaces them automatically from each mailbox's daily capacity.","maximum":240.0,"minimum":0.0,"title":"Min Interval Minutes"},"sender_timezone":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the hours are read in each sender's own timezone, so a New York sender and a London one each send 9 to 5 their time. False reads them in `timezone` for everyone. Absent or null means each sender's; an update that leaves it out keeps what is stored.","title":"Sender Timezone"},"timezone":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"description":"The IANA timezone the hours are read in, such as Europe/Berlin: the one timezone when `sender_timezone` is false, else the fallback for a sender with none. UTC when absent.","title":"Timezone"}},"title":"SendingWindowSchema","type":"object"},"SentOn":{"description":"Which of a mailbox's days the Mailboxes grid narrows to: its sender's today or yesterday.","enum":["today","yesterday"],"title":"SentOn","type":"string"},"SentStepEmailReadSchema":{"description":"The email a step got out to one contact, as it went.","properties":{"body":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The email's words as they were sent, without the signature and opt-out footer the send added below them.","title":"Body"},"email_html":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The email's HTML part exactly as it was handed to Gmail: the words, the sender's signature and the opt-out footer, every line, blank line and space as the contact got them. Null for a send from before the send kept its email.","title":"Email Html"},"sent_at":{"format":"date-time","title":"Sent At","type":"string"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},"required":["subject","body","sent_at"],"title":"SentStepEmailReadSchema","type":"object"},"SequenceAgentCopySchema":{"description":"Which sequence's agent setup to copy onto this sequence's agent.","properties":{"from_sequence_id":{"description":"The sequence whose agent setup is copied. Must be another of this workspace's.","format":"uuid","title":"From Sequence Id","type":"string"}},"required":["from_sequence_id"],"title":"SequenceAgentCopySchema","type":"object"},"SequenceAgentExampleReadSchema":{"description":"Persisted message copy and its human review outcomes.","properties":{"agent_version":{"title":"Agent Version","type":"integer"},"approved":{"title":"Approved","type":"boolean"},"body":{"title":"Body","type":"string"},"contact_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Label"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"declined":{"title":"Declined","type":"boolean"},"edited":{"title":"Edited","type":"boolean"},"is_sample":{"title":"Is Sample","type":"boolean"},"kind":{"$ref":"#/components/schemas/MessageKind"},"message_id":{"format":"uuid","title":"Message Id","type":"string"},"original_body":{"title":"Original Body","type":"string"},"original_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Subject"},"preview":{"anyOf":[{"$ref":"#/components/schemas/SequenceAgentPreviewReadSchema"},{"type":"null"}]},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"slot_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slot Key"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},"required":["message_id","slot_key","record_id","contact_label","kind","subject","body","original_subject","original_body","is_sample","approved","edited","declined","agent_version","created_at"],"title":"SequenceAgentExampleReadSchema","type":"object"},"SequenceAgentExamplesReadSchema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SequenceAgentExampleReadSchema"},"title":"Items","type":"array"},"next_cursor":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Next Cursor"}},"required":["items"],"title":"SequenceAgentExamplesReadSchema","type":"object"},"SequenceAgentPreviewFindingReadSchema":{"description":"One thing the checks noticed about the preview's words.","properties":{"code":{"title":"Code","type":"string"},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt"},"message":{"title":"Message","type":"string"},"severity":{"description":"warning (likely hurts) or info (worth knowing).","title":"Severity","type":"string"}},"required":["code","severity","message"],"title":"SequenceAgentPreviewFindingReadSchema","type":"object"},"SequenceAgentPreviewReadSchema":{"description":"One message the agent wrote for one contact as a preview.\n\nNobody receives it. Sender variables such as `{{Sender first name}}` are\nleft in place: they are filled in for whichever mailbox sends the real\nmessage.","properties":{"agent_version":{"description":"The saved agent version that wrote this sample.","title":"Agent Version","type":"integer"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The hook the message leads with.","title":"Angle"},"body":{"title":"Body","type":"string"},"cached":{"description":"True when the same preview was already written today and is shown again at no further cost.","title":"Cached","type":"boolean"},"comparison_context":{"anyOf":[{"$ref":"#/components/schemas/PreviewComparisonContext"},{"type":"null"}],"description":"Recorded input identities; absent on samples written before tracking began."},"confidence":{"anyOf":[{"$ref":"#/components/schemas/MessageConfidence"},{"type":"null"}],"description":"The agent's own read on whether the message is ready to send unedited."},"confidence_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The same read as a score from 0 to 100.","title":"Confidence Score"},"confident":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the message would be trusted to send on its own under a sender set to send when confident.","title":"Confident"},"created_at":{"description":"When this sample was first written.","format":"date-time","title":"Created At","type":"string"},"facts_offered":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How many facts from the contact's row the agent was handed for this sample: the row's cells and the prepared angles from its research and AI columns, as bounded. Null on samples written before it was recorded.","title":"Facts Offered"},"facts_used":{"description":"The facts about the contact the message is built on.","items":{"type":"string"},"title":"Facts Used","type":"array"},"findings":{"description":"What the checks noticed: spam phrases, placeholders, claims nobody can back.","items":{"$ref":"#/components/schemas/SequenceAgentPreviewFindingReadSchema"},"title":"Findings","type":"array"},"insufficient_data":{"description":"True when the agent said the contact's row gave it too little to go on.","title":"Insufficient Data","type":"boolean"},"kind":{"$ref":"#/components/schemas/MessageKind","description":"Which kind of message the step sends."},"message_id":{"description":"The preview's id; rate it through the agent's feedback like any message.","format":"uuid","title":"Message Id","type":"string"},"profile_read":{"default":false,"description":"True when the agent read the contact's LinkedIn profile for this preview.","title":"Profile Read","type":"boolean"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"An independent reviewer's score from 0 to 100 for how well the message is grounded, safe and on topic.","title":"Quality Score"},"reach":{"$ref":"#/components/schemas/AgentReach","description":"`web` when the agent researched the contact on the web for this preview."},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why the agent wrote what it wrote.","title":"Reasoning"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The subject; null when the message follows the previous email in its thread.","title":"Subject"},"written_as":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who the preview is written as, by name and title, when the sequence has two or more senders; null with one, when there is nobody to tell apart.","title":"Written As"}},"required":["message_id","agent_version","created_at","kind","subject","body","confidence","confidence_score","quality_score","confident","reasoning","insufficient_data","facts_used","angle","findings","reach","cached"],"title":"SequenceAgentPreviewReadSchema","type":"object"},"SequenceAgentPreviewRequestSchema":{"description":"Which message to preview, for which contact.","properties":{"fresh":{"default":false,"description":"Write a new message instead of showing the one already written for this step, contact and agent version. Set it when someone asks for another example: without it the same ask the same day is answered from what was written before, so a second ask returns the first message word for word. For a contact the sequence has not written to yet, a fresh write writes the contact's whole sequence again from its first step; it takes the daily preview allowance for each step it writes.","title":"Fresh","type":"boolean"},"record_id":{"description":"The contact: a row of the sequence's audience table.","format":"uuid","title":"Record Id","type":"string"},"step_id":{"description":"An agent-written step of this sequence: the one the `result` frame carries. The rest of the contact's sequence is written with it.","format":"uuid","title":"Step Id","type":"string"}},"required":["step_id","record_id"],"title":"SequenceAgentPreviewRequestSchema","type":"object"},"SequenceAgentPreviewStopResponseSchema":{"description":"A Stop was asked for. Whether it lands is the stream's to say.\n\nThe request is cooperative and best effort: the preview reads it before each\nmodel call and while the model writes, and a preview that has already\nfinished is not affected. The stream reports a Stop that landed as an `error`\nframe with reason `stopped`.","properties":{"preview_id":{"format":"uuid","title":"Preview Id","type":"string"}},"required":["preview_id"],"title":"SequenceAgentPreviewStopResponseSchema","type":"object"},"SequenceAgentReadSchema":{"description":"The sequence's outbound agent: the setup its agent-written steps and replies use.","properties":{"config":{"$ref":"#/components/schemas/OutboundAgentConfig","description":"Its personality, goal, call to action, language, per-step prompts, reply prompt and whether it drafts replies."},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"description":"The agent's id, as the /outbound-agents/ routes address it.","format":"uuid","title":"Id","type":"string"},"model_key":{"description":"The model it writes with: swift, core or deep.","title":"Model Key","type":"string"},"name":{"title":"Name","type":"string"},"research":{"description":"Whether the first message to a contact may research them on the web.","title":"Research","type":"boolean"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"version":{"description":"The configuration's version; every change writes a new one.","title":"Version","type":"integer"}},"required":["id","name","version","model_key","research","config","created_at","updated_at"],"title":"SequenceAgentReadSchema","type":"object"},"SequenceAnalyticsReadSchema":{"description":"No open or click rate, by construction: plain text has nothing to instrument.","properties":{"bounce_rate":{"title":"Bounce Rate","type":"number"},"bounced":{"title":"Bounced","type":"integer"},"connection_requests":{"default":0,"title":"Connection Requests","type":"integer"},"contacted":{"title":"Contacted","type":"integer"},"first_touch":{"default":0,"title":"First Touch","type":"integer"},"followed_up":{"default":0,"title":"Followed Up","type":"integer"},"linkedin_messages":{"default":0,"title":"Linkedin Messages","type":"integer"},"opt_out_rate":{"title":"Opt Out Rate","type":"number"},"pipeline_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pipeline Value"},"positive":{"default":0,"title":"Positive","type":"integer"},"positive_rate":{"default":0.0,"title":"Positive Rate","type":"number"},"profile_views":{"default":0,"title":"Profile Views","type":"integer"},"refreshed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Refreshed At"},"refreshing":{"default":false,"description":"True when these numbers were more than five minutes old and a refresh is running in the background. Read them again a few seconds later for newer numbers and a newer refreshed_at.","title":"Refreshing","type":"boolean"},"replied":{"title":"Replied","type":"integer"},"reply_rate":{"title":"Reply Rate","type":"number"},"sent":{"title":"Sent","type":"integer"},"series":{"items":{"$ref":"#/components/schemas/AnalyticsPointReadSchema"},"title":"Series","type":"array"},"unsubscribed":{"title":"Unsubscribed","type":"integer"}},"required":["contacted","replied","sent","bounced","unsubscribed","reply_rate","bounce_rate","opt_out_rate","series"],"title":"SequenceAnalyticsReadSchema","type":"object"},"SequenceAssistantAppliedContextSchema":{"description":"Context for a roster change an AI made through a granted workspace action.","properties":{"enrolled":{"default":0,"title":"Enrolled","type":"integer"},"name":{"default":"","title":"Name","type":"string"},"proposal_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Proposal Id"},"summary":{"default":"","title":"Summary","type":"string"},"type":{"const":"assistant_applied","default":"assistant_applied","title":"Type","type":"string"},"verb":{"default":"","title":"Verb","type":"string"}},"title":"SequenceAssistantAppliedContextSchema","type":"object"},"SequenceAssistantUndoneContextSchema":{"description":"Context for the reversal of an assistant's roster change.\n\nHistory only: undo was taken out of the assistant and nothing writes\nthis any more. It stays so trails written before that still read back.","properties":{"name":{"default":"","title":"Name","type":"string"},"proposal_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Proposal Id"},"removed":{"default":0,"title":"Removed","type":"integer"},"type":{"const":"assistant_undone","default":"assistant_undone","title":"Type","type":"string"},"verb":{"default":"","title":"Verb","type":"string"}},"title":"SequenceAssistantUndoneContextSchema","type":"object"},"SequenceAuditAction":{"description":"What happened to a sequence.\n\nNamed lifecycle events rather than a created/updated/deleted triad,\nbecause launch, pause and resume ARE the questions this trail exists to\nanswer. Deriving them from a status field-change would make every reader\nre-infer intent, and an engine pause carries a reason that is not a\nfield diff at all.\n\nOne action means exactly one context shape here. That is the property the\nenrichment trail lost when three different things all came to be stored\nas ``run_requested``, which is why its ``action`` can no longer tell a\nCSV download from an enrichment run. Keep it one-to-one.","enum":["created","edited","launched","paused","resumed","deleted","trashed","restored","purged","assistant_applied","assistant_undone","unrecognised"],"title":"SequenceAuditAction","type":"string"},"SequenceAuditLogReadSchema":{"description":"One entry in a sequence's activity trail.","properties":{"action":{"$ref":"#/components/schemas/SequenceAuditAction"},"actor":{"title":"Actor","type":"string"},"actor_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Display Name"},"actor_type":{"$ref":"#/components/schemas/ActorKind"},"context":{"discriminator":{"mapping":{"assistant_applied":"#/components/schemas/SequenceAssistantAppliedContextSchema","assistant_undone":"#/components/schemas/SequenceAssistantUndoneContextSchema","created":"#/components/schemas/SequenceCreatedContextSchema","deleted":"#/components/schemas/SequenceDeletedContextSchema","edited":"#/components/schemas/SequenceEditedContextSchema","launched":"#/components/schemas/SequenceLaunchedContextSchema","paused":"#/components/schemas/SequencePausedContextSchema","purged":"#/components/schemas/SequencePurgedContextSchema","restored":"#/components/schemas/SequenceRestoredContextSchema","resumed":"#/components/schemas/SequenceResumedContextSchema","trashed":"#/components/schemas/SequenceTrashedContextSchema","unrecognised":"#/components/schemas/UnrecognisedSequenceContextSchema"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/SequenceCreatedContextSchema"},{"$ref":"#/components/schemas/SequenceEditedContextSchema"},{"$ref":"#/components/schemas/SequenceLaunchedContextSchema"},{"$ref":"#/components/schemas/SequencePausedContextSchema"},{"$ref":"#/components/schemas/SequenceResumedContextSchema"},{"$ref":"#/components/schemas/SequenceDeletedContextSchema"},{"$ref":"#/components/schemas/SequenceTrashedContextSchema"},{"$ref":"#/components/schemas/SequenceRestoredContextSchema"},{"$ref":"#/components/schemas/SequencePurgedContextSchema"},{"$ref":"#/components/schemas/SequenceAssistantAppliedContextSchema"},{"$ref":"#/components/schemas/SequenceAssistantUndoneContextSchema"},{"$ref":"#/components/schemas/UnrecognisedSequenceContextSchema"}],"title":"Context"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"proposal_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Proposal Id"},"sequence_id":{"format":"uuid","title":"Sequence Id","type":"string"}},"required":["id","sequence_id","action","actor_type","actor","context","created_at"],"title":"SequenceAuditLogReadSchema","type":"object"},"SequenceBudgetReadSchema":{"properties":{"charged_tenths":{"description":"What the sequence has actually spent, in tenths.","title":"Charged Tenths","type":"integer"},"limit_tenths":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The sequence's spending cap in tenths of a credit, or null when it has no cap.","title":"Limit Tenths"},"reserved_tenths":{"description":"Held against work already claimed but not yet settled, in tenths.","title":"Reserved Tenths","type":"integer"}},"required":["limit_tenths","charged_tenths","reserved_tenths"],"title":"SequenceBudgetReadSchema","type":"object"},"SequenceCampaignReadSchema":{"description":"The campaign a sequence runs, why tailoring chose it, and an older tailoring's brief.","properties":{"angle":{"description":"An older tailoring's brief: the angle.","title":"Angle","type":"string"},"audience":{"description":"An older tailoring's brief: who it writes to.","title":"Audience","type":"string"},"campaign_key":{"title":"Campaign Key","type":"string"},"campaign_name":{"title":"Campaign Name","type":"string"},"chosen_by_person":{"title":"Chosen By Person","type":"boolean"},"goal":{"description":"The goal tailoring set; empty when it set none. The agent's own goal is the one it writes toward.","title":"Goal","type":"string"},"intent":{"description":"What the person asked for, in their own words.","title":"Intent","type":"string"},"reason":{"description":"Why tailoring chose it, in one line; empty when a person chose it.","title":"Reason","type":"string"},"step_notes":{"additionalProperties":{"type":"string"},"description":"An older tailoring's notes, one per step, by step id.","title":"Step Notes","type":"object"},"table_name":{"title":"Table Name","type":"string"},"tailoring_off":{"description":"The person chose the standard instructions.","title":"Tailoring Off","type":"boolean"},"why_now":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"An older tailoring's brief: why now.","title":"Why Now"}},"required":["campaign_key","campaign_name","reason","goal","audience","why_now","angle","step_notes","intent","table_name","chosen_by_person","tailoring_off"],"title":"SequenceCampaignReadSchema","type":"object"},"SequenceCapacityReadSchema":{"description":"The combined daily capacity of the assigned senders.","properties":{"connected_mailbox_count":{"title":"Connected Mailbox Count","type":"integer"},"daily_ceiling":{"description":"Sum of every assigned, connected mailbox's daily send limit.","title":"Daily Ceiling","type":"integer"},"mailbox_count":{"title":"Mailbox Count","type":"integer"},"remaining_today":{"description":"max(0, daily_ceiling - sent_today); zero if no sender is assigned or none of their mailboxes is connected.","title":"Remaining Today","type":"integer"},"sends_email":{"description":"Whether the sequence has any email step. False for a LinkedIn-only cadence, where mailbox capacity and runway do not apply and are not shown.","title":"Sends Email","type":"boolean"},"sent_today":{"title":"Sent Today","type":"integer"}},"required":["mailbox_count","connected_mailbox_count","daily_ceiling","sent_today","remaining_today","sends_email"],"title":"SequenceCapacityReadSchema","type":"object"},"SequenceChangeGroupSchema":{"description":"The part of the sequence a review row is about, which the dialog groups its rows under.\n\nA step's rows sit under the step's name as the edit leaves it, with the\nname it had before when the edit renamed it (``was``), and ``state`` when\nthe edit adds or removes the whole step (Natsuki, 2026-10-08: the review\nreads as one list grouped by step and by tab, never one flat table).","properties":{"key":{"description":"Stable within one review: the rows sharing it form one group.","title":"Key","type":"string"},"kind":{"enum":["step","connections","writing","writing_action","audience","senders","settings"],"title":"Kind","type":"string"},"state":{"anyOf":[{"enum":["added","removed"],"type":"string"},{"type":"null"}],"title":"State"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Step Id"},"step_kind":{"anyOf":[{"$ref":"#/components/schemas/SequenceStepKind"},{"type":"null"}],"description":"A step group's kind, for its icon."},"title":{"description":"The heading, as the screen that owns the part names it.","title":"Title","type":"string"},"was":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A step's name before the change, when the change renamed it.","title":"Was"}},"required":["key","kind","title"],"title":"SequenceChangeGroupSchema","type":"object"},"SequenceChangeReadSchema":{"properties":{"after":{"title":"After"},"before":{"title":"Before"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The stored field the row is about, so a screen that words that field itself (a sending window, a call to action link) can draw the value in its own words.","title":"Field"},"group":{"anyOf":[{"$ref":"#/components/schemas/SequenceChangeGroupSchema"},{"type":"null"}]},"label":{"title":"Label","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The row's own name inside its group, without the group's.","title":"Name"},"undo":{"anyOf":[{"$ref":"#/components/schemas/SequenceChangeUndoSchema"},{"type":"null"}]}},"required":["label","before","after"],"title":"SequenceChangeReadSchema","type":"object"},"SequenceChangeUndoSchema":{"description":"Which part of the staged change set an Undo on the row takes back.\n\n``fields`` are the stored fields of the section (or of the step) the row\nis about; a connection names the way out by its step (None for the start)\nand its branch. The dialog puts each back as it stands on the sequence now.","properties":{"branch":{"anyOf":[{"$ref":"#/components/schemas/SequenceEdgeBranch"},{"type":"null"}]},"fields":{"items":{"type":"string"},"title":"Fields","type":"array"},"kind":{"enum":["settings","agent","agent_config","step","step_added","step_removed","connection","senders","mapping","audience","writing_action"],"title":"Kind","type":"string"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Step Id"}},"required":["kind"],"title":"SequenceChangeUndoSchema","type":"object"},"SequenceChangesPreviewSchema":{"properties":{"active_contacts":{"title":"Active Contacts","type":"integer"},"approvals_released":{"default":0,"description":"Cards waiting for approval in Tasks that the change lets go out without it, at most: those on a step whose approval it switches off, held only by the sequence's own approval for their channel, which it loosens, or held by a sender's own setting when it takes a sender off (that sender may have been the strictest). A card the remaining senders' setting or the agent's words on review still holds stays, and so does one a person edited and has not approved.","title":"Approvals Released","type":"integer"},"audience_restart":{"anyOf":[{"$ref":"#/components/schemas/AudienceRestartReviewSchema"},{"type":"null"}],"description":"Set when the change replaces the audience and starts contacts over."},"changes":{"items":{"$ref":"#/components/schemas/SequenceChangeReadSchema"},"title":"Changes","type":"array"},"finished_contacts_at_most":{"default":false,"description":"True when the two finished-contact counts are of who stands at those ends, the most that go on, rather than each contact judged: more stand there than the review judges one by one. They are judged when the change applies.","title":"Finished Contacts At Most","type":"boolean"},"finished_contacts_awaiting_answer":{"additionalProperties":{"type":"integer"},"description":"For each connection request whose branches all ended and one of which the change gives a step, by step id: how many contacts who finished once it was sent go back to waiting for its answer, judged as above.","propertyNames":{"format":"uuid"},"title":"Finished Contacts Awaiting Answer","type":"object"},"finished_contacts_continuing":{"additionalProperties":{"type":"integer"},"description":"For each step a contact who had finished goes on to, by step id: how many finished at an end the change connects to that step, and go on to it once the change applies. Those who since replied, opted out, bounced, went on the do-not-contact list, answered or joined another sequence, were reached by one, left the audience, or lost their mailbox stay finished. Empty when the change connects no end anyone finished at.","propertyNames":{"format":"uuid"},"title":"Finished Contacts Continuing","type":"object"},"mailbox_stopped_contacts":{"description":"Live contacts the change stops at their next email because it removes the sender whose mailbox emails them: a contact is only ever emailed from one mailbox. LinkedIn steps before that email still run.","title":"Mailbox Stopped Contacts","type":"integer"},"processing_contacts":{"title":"Processing Contacts","type":"integer"},"removed_step_contacts":{"title":"Removed Step Contacts","type":"integer"},"removed_step_going_on":{"default":0,"description":"Live contacts on the steps the change removes who go on to what now follows them, as a new contact would, or finish there when nothing does; the rest of those on removed steps stop (removed_step_contacts).","title":"Removed Step Going On","type":"integer"},"removed_steps":{"description":"Each removed step anybody stands on, by name, with what happens to them: the review says it per step. `removed_step_contacts` and `removed_step_going_on` are the same counts summed.","items":{"$ref":"#/components/schemas/RemovedStepReviewSchema"},"title":"Removed Steps","type":"array"},"review_token":{"title":"Review Token","type":"string"},"rewritten_messages":{"default":0,"description":"Messages the agent already wrote and nobody has sent, edited or approved that the change has it write again: their step's prompt, subject or thread changed, or how the agent writes did. A person's own edit and words a person approved are kept.","title":"Rewritten Messages","type":"integer"},"rewritten_messages_tenths":{"default":0,"description":"The most writing those messages again costs, in tenths of a credit: each at the dearest turn the agent's settings allow.","title":"Rewritten Messages Tenths","type":"integer"},"shortened_window_contacts":{"additionalProperties":{"type":"integer"},"description":"For each connection request whose answer window the change shortens, by step id: how many contacts waiting for its answer have already waited longer than the new window, so their wait ends as soon as the change applies. Empty when no window shortens.","propertyNames":{"format":"uuid"},"title":"Shortened Window Contacts","type":"object"},"waiting_contacts":{"title":"Waiting Contacts","type":"integer"}},"required":["changes","active_contacts","processing_contacts","waiting_contacts","removed_step_contacts","mailbox_stopped_contacts","review_token"],"title":"SequenceChangesPreviewSchema","type":"object"},"SequenceChangesSchema":{"description":"A person's waiting changes to a live sequence, as Review changes holds them.","properties":{"agent":{"anyOf":[{"$ref":"#/components/schemas/OutboundAgentUpdateSchema"},{"type":"null"}]},"audience":{"anyOf":[{"$ref":"#/components/schemas/AudiencePutSchema"},{"type":"null"}]},"copy_from_sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Copy From Sequence Id"},"expected_agent_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Agent Version"},"expected_updated_at":{"format":"date-time","title":"Expected Updated At","type":"string"},"graph":{"anyOf":[{"$ref":"#/components/schemas/SequenceGraphPutSchema"},{"type":"null"}]},"mapping":{"anyOf":[{"$ref":"#/components/schemas/ColumnMappingSchema"},{"type":"null"}]},"prompt_proposal":{"anyOf":[{"$ref":"#/components/schemas/OutboundPromptProposalAcceptSchema"},{"type":"null"}]},"restore_version":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"title":"Restore Version"},"review_token":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Review Token"},"sender_profile_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array"},{"type":"null"}],"title":"Sender Profile Ids"},"settings":{"anyOf":[{"$ref":"#/components/schemas/SequenceUpdateSchema"},{"type":"null"}]},"training_revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Training Revision"},"training_rewrite":{"default":false,"title":"Training Rewrite","type":"boolean"},"training_session_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Training Session Id"},"training_slot_keys":{"anyOf":[{"items":{"maxLength":255,"type":"string"},"maxItems":100,"type":"array"},{"type":"null"}],"title":"Training Slot Keys"}},"required":["expected_updated_at"],"title":"SequenceChangesSchema","type":"object"},"SequenceChangesStepPreviewReadSchema":{"description":"What a step's Preview shows of the waiting changes for one contact.","properties":{"changed":{"description":"Whether the waiting changes change this step's words for this contact. False: the step reads as it does live (the changes touch something else, or the contact keeps the words they have: a person's own, words a person approved or a send holds, or, for a lesson, words already written for them or a thread marked Looks good), and nothing was written.","title":"Changed","type":"boolean"},"message":{"anyOf":[{"$ref":"#/components/schemas/RenderedMessageReadSchema"},{"type":"null"}],"description":"The step as the contact would get it once the changes are live. A step the agent writes is written again from the changes, spending one of the day's free previews per step written, and is saved nowhere: it names no `message_id`. The words written are kept for 30 minutes for this contact and these changes, so another step's Preview and a test send read them and spend nothing."},"reaches":{"default":true,"description":"Whether the changes reach this contact: false once this step has gone to them, when they are past it or down another branch, when they are done with the sequence and the changes do not carry them on, or when they are not in it.","title":"Reaches","type":"boolean"},"sent_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this step went to the contact, when it has.","title":"Sent At"},"suggested_record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A contact of `candidate_record_ids` the changes do reach, offered in place of `record_id`, which they do not; `message` is then empty.","title":"Suggested Record Id"}},"required":["changed"],"title":"SequenceChangesStepPreviewReadSchema","type":"object"},"SequenceChangesStepPreviewSchema":{"description":"One step for one contact, as a person's waiting changes would have it.","properties":{"candidate_record_ids":{"description":"Contacts the Preview may show instead, in the order it lists them. When the changes do not reach `record_id` and one of these they do reach, that one is offered as `suggested_record_id` and nothing is written.","items":{"format":"uuid","type":"string"},"maxItems":50,"title":"Candidate Record Ids","type":"array"},"changes":{"$ref":"#/components/schemas/SequenceChangesSchema"},"record_id":{"description":"The contact the step is shown for.","format":"uuid","title":"Record Id","type":"string"},"step_id":{"format":"uuid","title":"Step Id","type":"string"},"write":{"default":true,"description":"False answers whether the changes change this step and reach the contact, and writes nothing for a step the agent writes: no preview is spent. A typed step is filled in either way, which costs nothing.","title":"Write","type":"boolean"}},"required":["changes","step_id","record_id"],"title":"SequenceChangesStepPreviewSchema","type":"object"},"SequenceChangesTestSendSchema":{"description":"A test email of one step as a person's waiting changes would send it.","properties":{"changes":{"$ref":"#/components/schemas/SequenceChangesSchema"},"mailbox_id":{"format":"uuid","title":"Mailbox Id","type":"string"},"record_id":{"description":"The contact the variables render against.","format":"uuid","title":"Record Id","type":"string"},"step_id":{"format":"uuid","title":"Step Id","type":"string"},"to_address":{"maxLength":320,"minLength":3,"title":"To Address","type":"string"}},"required":["mailbox_id","to_address","record_id","changes","step_id"],"title":"SequenceChangesTestSendSchema","type":"object"},"SequenceColumnContent":{"description":"Which of a sequence's two mirrors a SEQUENCE column holds.\n\n``STATUS`` is one short sentence about where the contact stands.\n``MESSAGES`` is a list with one object per email or LinkedIn message the\nsequence sent them, which formulas, AI columns and exports may read.","enum":["status","messages"],"title":"SequenceColumnContent","type":"string"},"SequenceColumnDefinition":{"description":"Definition of a sequence column: one contact's live cadence state, or what it sent them.\n\nThe referenced sequence is denormalized by id only; rendering needs nothing\nbeyond the cell's own value, and the outreach stratum owns the write path\n(see ``TableColumnKind.SEQUENCE``).","properties":{"content":{"$ref":"#/components/schemas/SequenceColumnContent","default":"status","description":"Whether the column holds the contact's status or the messages sent to them."},"kind":{"const":"sequence","default":"sequence","title":"Kind","type":"string"},"sequence_id":{"description":"The sequence whose enrolment status this column mirrors.","format":"uuid","title":"Sequence Id","type":"string"}},"required":["sequence_id"],"title":"SequenceColumnDefinition","type":"object"},"SequenceConditionKind":{"description":"The branching conditions.\n\n``BOUNCED`` and ``REPLIED`` are only pickable after a message step exists\nearlier on the same path: enforced at save, explained in the picker.","enum":["has_email","has_linkedin_url","linkedin_connected","bounced","replied","linkedin_invite_accepted","linkedin_open_profile"],"title":"SequenceConditionKind","type":"string"},"SequenceCreateSchema":{"properties":{"goal":{"anyOf":[{"maxLength":1000,"minLength":1,"type":"string"},{"type":"null"}],"description":"Only with `proposal_id`: the goal the person chose for it, instead of the one tailoring chose.","title":"Goal"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"Defaults to 'New sequence'.","title":"Name"},"proposal_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A tailored proposal (POST /sequences/proposals/) to make the sequence from: it carries the audience, the senders and the campaign, so give only a name, a timezone and, if the person changed it, the goal beside it.","title":"Proposal Id"},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":1000,"minItems":1,"type":"array"},{"type":"null"}],"title":"Record Ids"},"sender_profile_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array"},{"type":"null"}],"description":"The senders to send from, assigned before the audience so the campaign is tailored knowing who sends. Omitted leaves the sequence with none.","title":"Sender Profile Ids"},"starter":{"default":"ai","enum":["ai","written","blank","template"],"title":"Starter","type":"string"},"table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Table Id"},"template_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Template Id"},"timezone":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"The creating browser's IANA timezone; seeds the default deliverability sending window. UTC when absent, or when it is not a timezone the send engine knows.","title":"Timezone"},"view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"View Id"}},"title":"SequenceCreateSchema","type":"object"},"SequenceCreatedContextSchema":{"description":"Context for a sequence's creation.","properties":{"duplicated_from_name":{"default":"","title":"Duplicated From Name","type":"string"},"name":{"default":"","title":"Name","type":"string"},"source":{"default":"new","enum":["new","duplicate"],"title":"Source","type":"string"},"type":{"const":"created","default":"created","title":"Type","type":"string"}},"title":"SequenceCreatedContextSchema","type":"object"},"SequenceDeletedContextSchema":{"description":"Context for a deletion.","properties":{"name":{"default":"","title":"Name","type":"string"},"type":{"const":"deleted","default":"deleted","title":"Type","type":"string"}},"title":"SequenceDeletedContextSchema","type":"object"},"SequenceDiscardReadSchema":{"properties":{"discarded":{"description":"True when the draft was untouched and is now deleted; false leaves it.","title":"Discarded","type":"boolean"}},"required":["discarded"],"title":"SequenceDiscardReadSchema","type":"object"},"SequenceEdgeBranch":{"description":"Which way an edge leaves its step.\n\nDEFAULT for message-step flow; YES/NO for a condition's two branches. A\nconnection request leaves by the answer it got: CONNECTED (accepted, and\nalready connected unless that has a branch of its own), ALREADY_CONNECTED\n(present only when the request splits it out) and NOT_ACCEPTED.","enum":["default","yes","no","connected","already_connected","not_accepted"],"title":"SequenceEdgeBranch","type":"string"},"SequenceEdgeSchema":{"properties":{"branch":{"$ref":"#/components/schemas/SequenceEdgeBranch","default":"default","description":"Which way the connection leaves its step. `default` is the one way on from an email or a LinkedIn step; a condition leaves by `yes` and `no`. A connection request leaves by the answer it gets: `connected` (accepted, or connected already) and `not_accepted` (not accepted within its window), plus `already_connected` when already-connected contacts get a branch of their own; any of them may go to the same step. A connection request saved with one `default` connection, or none, gets both branches going where it went."},"from_step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"None = the start node.","title":"From Step Id"},"to_step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"None = an end node.","title":"To Step Id"}},"title":"SequenceEdgeSchema","type":"object"},"SequenceEditedContextSchema":{"description":"Context for an edit to one surface of a sequence.","properties":{"changes":{"items":{"$ref":"#/components/schemas/SequenceFieldChangeSchema"},"title":"Changes","type":"array"},"fields":{"items":{"type":"string"},"title":"Fields","type":"array"},"name":{"default":"","title":"Name","type":"string"},"surface":{"default":"","title":"Surface","type":"string"},"type":{"const":"edited","default":"edited","title":"Type","type":"string"}},"title":"SequenceEditedContextSchema","type":"object"},"SequenceFavoriteUpdateSchema":{"description":"Request body for starring or unstarring a sequence.","properties":{"is_favorite":{"description":"Whether this person wants the sequence starred.","title":"Is Favorite","type":"boolean"}},"required":["is_favorite"],"title":"SequenceFavoriteUpdateSchema","type":"object"},"SequenceFieldChangeSchema":{"properties":{"after":{"title":"After"},"before":{"title":"Before"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field"},"label":{"title":"Label","type":"string"}},"required":["label"],"title":"SequenceFieldChangeSchema","type":"object"},"SequenceFunnelReadSchema":{"description":"Live per-node counts overlaid on the builder.","properties":{"branches":{"items":{"$ref":"#/components/schemas/BranchSplitReadSchema"},"title":"Branches","type":"array"},"nodes":{"items":{"$ref":"#/components/schemas/NodeFunnelReadSchema"},"title":"Nodes","type":"array"},"orphaned_executed":{"title":"Orphaned Executed","type":"integer"}},"required":["nodes","branches","orphaned_executed"],"title":"SequenceFunnelReadSchema","type":"object"},"SequenceGraphPutSchema":{"properties":{"edges":{"items":{"$ref":"#/components/schemas/SequenceEdgeSchema"},"maxItems":1000,"title":"Edges","type":"array"},"expected_updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Autosave concurrency token; a mismatch means another tab saved first (409).","title":"Expected Updated At"},"steps":{"items":{"$ref":"#/components/schemas/SequenceStepSchema-Input"},"maxItems":200,"title":"Steps","type":"array"}},"title":"SequenceGraphPutSchema","type":"object"},"SequenceHold":{"description":"One reason a live contact cannot move right now, as the sequence's pages say it.\n\nThe stored ``HoldReason`` and the task-derived ``WaitingOn`` each cover part\nof this; the LinkedIn account's own state covers the rest. This is their\nunion, read at request time, so the Overview, the Audience tab, the header\nand the Sequences list name one reason with one word (the silent-stall\nplan, approved 2026-09-30).\n\nListed worst first: the order is the order a page picks its one headline\nor banner by. The first five need a person; ``EMAIL_CHECK`` may (it ends\nby itself while the deliverability column runs); ``APPROVAL`` needs one\nbut has its own row and banner already; the rest end on their own.","enum":["linkedin_verify_account","linkedin_disconnected","no_mailbox","no_message","linkedin_browser_offline","email_check","approval","daily_cap","linkedin_daily_limit","linkedin_weekly_limit","window","writing_delayed","queued_to_write"],"title":"SequenceHold","type":"string"},"SequenceHoldReadSchema":{"description":"How many live contacts one reason holds, and what a page needs to say it.","properties":{"action_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For a LinkedIn limit: the kind of step it stopped.","title":"Action Kind"},"contacts":{"title":"Contacts","type":"integer"},"last_seen_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"For an offline browser: its last check-in.","title":"Last Seen At"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"For a LinkedIn limit: the limit.","title":"Limit"},"long_offline":{"default":false,"description":"For an offline browser: nothing for over a day.","title":"Long Offline","type":"boolean"},"reason":{"$ref":"#/components/schemas/SequenceHold","description":"What holds them, worst first in the list: a LinkedIn account asking to be verified or disconnected, no mailbox, a step with no message, an offline LinkedIn browser, approval, the email or LinkedIn daily limit, the weekly invitation limit, the sending window, or the AI writer."},"sender_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"That sender's first name, else their name.","title":"Sender Name"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"For a LinkedIn reason: the sender whose account it is.","title":"Sender Profile Id"},"until":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the reason ends on its own: the window's next opening, a daily limit's reset, the AI writer's next try. Null where only a person ends it.","title":"Until"},"used":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"For a LinkedIn limit: how many used.","title":"Used"}},"required":["reason","contacts"],"title":"SequenceHoldReadSchema","type":"object"},"SequenceHoldsReadSchema":{"description":"Whether anybody on a sequence can move right now, and if not, why.","properties":{"holds":{"items":{"$ref":"#/components/schemas/SequenceHoldReadSchema"},"title":"Holds","type":"array"},"moving":{"description":"Live contacts nothing holds: due now, sending, in line on a working browser, or waiting out an ordinary step delay. Zero with holds listed means nobody can move.","title":"Moving","type":"integer"},"steps":{"items":{"$ref":"#/components/schemas/StepHoldReadSchema"},"title":"Steps","type":"array"},"window_opens_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The sending window's next opening while it is shut; null while open.","title":"Window Opens At"}},"required":["moving","window_opens_at","holds","steps"],"title":"SequenceHoldsReadSchema","type":"object"},"SequenceLaunchReadSchema":{"description":"The launched sequence, with who it starts on now and when the rest start.","properties":{"audience_table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Audience Table Id"},"audience_view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Audience View Id"},"bcc_addresses":{"description":"Blind copies on every email this sequence sends.","items":{"type":"string"},"title":"Bcc Addresses","type":"array"},"cc_addresses":{"description":"Addresses copied on every email this sequence sends.","items":{"type":"string"},"title":"Cc Addresses","type":"array"},"column_mapping":{"$ref":"#/components/schemas/ColumnMappingSchema"},"connection_requests_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connection Requests Sent"},"connections_accepted":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Invitations from this sequence confirmed accepted. With connection_requests_sent this yields the acceptance rate.","title":"Connections Accepted"},"contacts_added":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Rollup, list reads only. None when the list's stats have never been built and could not be built on this request (for example, another request was building them). Show a zero state, not a fake 0.","title":"Contacts Added"},"contacts_failed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contacts Failed"},"contacts_finished":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contacts Finished"},"contacts_in_progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contacts In Progress"},"contacts_not_started":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A draft's contacts, who start when it launches (rollup, list reads only).","title":"Contacts Not Started"},"continuous_enrolment":{"default":false,"description":"TRUE keeps the audience live: rows added to the table later enrol on their own, and rows that leave it stop. FALSE (the default for a new sequence) freezes the audience after launch; Add to sequence still adds rows to it by hand.","title":"Continuous Enrolment","type":"boolean"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"edges":{"items":{"$ref":"#/components/schemas/SequenceEdgeSchema"},"title":"Edges","type":"array"},"email_approval_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`manual` requires approval; `confident` adds approval for uncertain AI-written emails; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.","title":"Email Approval Mode"},"emails_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Emails Sent"},"hold":{"anyOf":[{"$ref":"#/components/schemas/SequenceListHoldSchema"},{"type":"null"}],"description":"List reads only, read live on every request (never from the cached stats): on a running sequence nobody on which can move, the worst reason holding them (as GET /sequences/{id}/holds/ names it). Null while anybody moves and on any other status."},"id":{"format":"uuid","title":"Id","type":"string"},"is_favorite":{"default":false,"description":"List reads only: whether the person asking starred the sequence. Their own, never a teammate's; always false for an API key.","title":"Is Favorite","type":"boolean"},"last_synced_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the audience-enrolment diff last completed. None until the first sync (launch runs one inline). The Audience tab shows this plus a manual trigger, never a background job the user cannot see.","title":"Last Synced At"},"last_viewed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"List reads only: when the person asking last opened the sequence; null when they never have, and for an API key.","title":"Last Viewed At"},"launched_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Launched At"},"linkedin_approval_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`manual` requires approval; `confident` adds approval for uncertain AI-written LinkedIn steps; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.","title":"Linkedin Approval Mode"},"linkedin_check_max_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"deprecated":true,"description":"Retired. Acceptance checks now use the service-managed interval.","title":"Linkedin Check Max Seconds"},"linkedin_check_min_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"deprecated":true,"description":"Retired. Acceptance checks now use the service-managed interval.","title":"Linkedin Check Min Seconds"},"linkedin_messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linkedin Messages Sent"},"multithreading":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Multithreading"},"name":{"title":"Name","type":"string"},"opportunity_values":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"description":"Dollars per outcome label; None = tracking off.","title":"Opportunity Values"},"opt_out_footer_text":{"title":"Opt Out Footer Text","type":"string"},"outbound_agent_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The sequence's outbound agent: the writer of every agent-written step and of its replies. Read and configure it under /outbound-agents/{id}/.","title":"Outbound Agent Id"},"pause_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pause Reason"},"plain_text_only":{"default":true,"description":"TRUE (recommended) sends no formatting: the bold, italic and link marks are stripped and the email reads as plain text; FALSE renders them. Either way the email carries an HTML part laid out line for line, which keeps its spacing exactly, beside a matching text part.","title":"Plain Text Only","type":"boolean"},"positive":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Threads labelled positive (rollup, list reads only).","title":"Positive"},"positive_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Positive Rate"},"replies":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Distinct contacts who replied: reply_rate's numerator.","title":"Replies"},"reply_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reply Rate"},"sender_profile_ids":{"description":"Only meaningful on list reads: the sequence's senders by id, in the same order as sender_profile_names.","items":{"format":"uuid","type":"string"},"title":"Sender Profile Ids","type":"array"},"sender_profile_names":{"description":"Only meaningful on list reads: the names of the sequence's senders.","items":{"type":"string"},"title":"Sender Profile Names","type":"array"},"senders_ready":{"default":true,"description":"Only meaningful on list reads: False when the sequence has senders but none currently has a connected mailbox.","title":"Senders Ready","type":"boolean"},"sending_priority":{"default":"new_contacts","description":"Who gets scarce capacity first: new_contacts or follow_ups.","title":"Sending Priority","type":"string"},"sending_window":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sending Window"},"sending_window_problem":{"anyOf":[{"$ref":"#/components/schemas/SendingWindowProblemSchema"},{"type":"null"}],"description":"Set when the saved sending_window breaks a rule a save now refuses, which only a window saved before those rules can. It still sends on it as stored: an unknown timezone is read as UTC, and no open day sends at any hour. Fix it by saving a valid sending_window."},"spending_limit_tenths":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Spending Limit Tenths"},"starting_now":{"description":"Contacts due the moment the launch finished, which the engine starts at once. Poll /sequences/{id}/start-progress/ to follow them.","title":"Starting Now","type":"integer"},"starts_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the roster starts, when that is later than now because the sending window is closed; null when the window is open.","title":"Starts At"},"status":{"$ref":"#/components/schemas/SequenceStatus"},"status_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Status Column Id"},"step_count":{"title":"Step Count","type":"integer"},"steps":{"items":{"$ref":"#/components/schemas/SequenceStepSchema-Output"},"title":"Steps","type":"array"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","status","audience_table_id","audience_view_id","column_mapping","status_column_id","sending_window","multithreading","opt_out_footer_text","launched_at","pause_reason","created_at","updated_at","steps","edges","step_count","starting_now","starts_at"],"title":"SequenceLaunchReadSchema","type":"object"},"SequenceLaunchedContextSchema":{"description":"Context for a launch.","properties":{"name":{"default":"","title":"Name","type":"string"},"type":{"const":"launched","default":"launched","title":"Type","type":"string"}},"title":"SequenceLaunchedContextSchema","type":"object"},"SequenceListHoldSchema":{"description":"The one reason a running sequence's list row names while nobody on it can move.","properties":{"contacts":{"description":"How many contacts it holds: for approval, the cards waiting in Tasks, which the row names (\"Waiting for approval: 10\").","title":"Contacts","type":"integer"},"long_offline":{"default":false,"description":"For an offline browser: nothing for over a day.","title":"Long Offline","type":"boolean"},"reason":{"$ref":"#/components/schemas/SequenceHold"},"sender_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For a LinkedIn reason: whose account it is.","title":"Sender Name"},"until":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the reason ends on its own, where it does.","title":"Until"},"window_open":{"default":true,"description":"Whether the sending window was open when this was read. An offline browser is only worth a warning while it is (call C3).","title":"Window Open","type":"boolean"}},"required":["reason","contacts"],"title":"SequenceListHoldSchema","type":"object"},"SequenceListReadSchema":{"description":"The list rows plus when their rollup metrics were last computed.","properties":{"sequences":{"items":{"$ref":"#/components/schemas/SequenceReadSchema"},"title":"Sequences","type":"array"},"stats_refreshed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the list's stats were computed. Stats of any age are served at once. None only when they have never been built and could not be built on this request (for example, another request was building them).","title":"Stats Refreshed At"},"stats_refreshing":{"description":"True when the stats were more than five minutes old and a refresh is running in the background. Read the list again a few seconds later for newer numbers and a newer stats_refreshed_at.","title":"Stats Refreshing","type":"boolean"}},"required":["sequences","stats_refreshed_at","stats_refreshing"],"title":"SequenceListReadSchema","type":"object"},"SequencePausedContextSchema":{"description":"Context for a pause, and why it happened.","properties":{"name":{"default":"","title":"Name","type":"string"},"reason":{"default":"manual","title":"Reason","type":"string"},"type":{"const":"paused","default":"paused","title":"Type","type":"string"}},"title":"SequencePausedContextSchema","type":"object"},"SequenceProposalCampaignSchema":{"description":"The campaign tailoring chose for a proposal, why, its goal, and its rewritten steps.","properties":{"campaign_key":{"title":"Campaign Key","type":"string"},"campaign_name":{"title":"Campaign Name","type":"string"},"chosen_by_person":{"description":"The person chose this campaign themselves.","title":"Chosen By Person","type":"boolean"},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The goal tailoring chose, one of the goal presets.","title":"Goal"},"reason":{"description":"Why tailoring chose it, in one line; empty when the person chose it.","title":"Reason","type":"string"},"steps":{"items":{"$ref":"#/components/schemas/SequenceProposalStepSchema"},"title":"Steps","type":"array"},"summary":{"title":"Summary","type":"string"}},"required":["campaign_key","campaign_name","summary","reason","chosen_by_person","goal","steps"],"title":"SequenceProposalCampaignSchema","type":"object"},"SequenceProposalCreateSchema":{"description":"What New sequence asks before anything is made: who to write to, who sends, what for.","properties":{"campaign_key":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"A campaign from the library to run, by key (see the outbound presets' campaigns). Omitted, tailoring chooses the one that fits the audience best.","title":"Campaign Key"},"intent":{"default":"","description":"What the campaign is for, in the person's own words: an event, a launch, an offer, who to reach. The one part of a campaign an email may state as fact.","maxLength":500,"title":"Intent","type":"string"},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":1000,"minItems":1,"type":"array"},{"type":"null"}],"description":"Chosen rows, when the audience is those rows only.","title":"Record Ids"},"sender_profile_ids":{"description":"The senders it sends from; each email is written as its sender.","items":{"format":"uuid","type":"string"},"maxItems":100,"title":"Sender Profile Ids","type":"array"},"table_id":{"description":"The audience's table.","format":"uuid","title":"Table Id","type":"string"},"view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A saved view narrowing the audience; null is the whole table.","title":"View Id"}},"required":["table_id"],"title":"SequenceProposalCreateSchema","type":"object"},"SequenceProposalDiscardReadSchema":{"description":"What discarding a proposal did.","properties":{"discarded":{"description":"False when the proposal already made its sequence and was kept.","title":"Discarded","type":"boolean"}},"required":["discarded"],"title":"SequenceProposalDiscardReadSchema","type":"object"},"SequenceProposalReadSchema":{"description":"A sequence not made yet, and how its tailoring stands.","properties":{"campaign":{"anyOf":[{"$ref":"#/components/schemas/SequenceProposalCampaignSchema"},{"type":"null"}],"description":"The tailored campaign; null means the sequence starts on the standard one."},"id":{"format":"uuid","title":"Id","type":"string"},"in_flight":{"description":"Tailoring is still working; poll until false.","title":"In Flight","type":"boolean"},"intent":{"title":"Intent","type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why it was skipped or failed, as a code.","title":"Reason"},"record_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How many chosen rows, when rows were chosen.","title":"Record Count"},"sender_profile_ids":{"items":{"format":"uuid","type":"string"},"title":"Sender Profile Ids","type":"array"},"sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The sequence made from it, once made.","title":"Sequence Id"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"While in flight: starting, choosing (the campaign) or writing (its steps for the company).","title":"Stage"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The tailoring's outcome once settled: ready_for_review (a campaign is ready), skipped or failed.","title":"Status"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"table_name":{"title":"Table Name","type":"string"},"view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"View Id"}},"required":["id","table_id","table_name","view_id","record_count","sender_profile_ids","intent","in_flight","stage","status","reason","campaign","sequence_id"],"title":"SequenceProposalReadSchema","type":"object"},"SequenceProposalStepSchema":{"description":"One step of a proposed campaign, as the creation dialog lists it.","properties":{"arm":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The answer to the campaign's connection request this step waits for: `connected` or `not_accepted`. Null before the request, and on a step that goes on whatever the answer, which the sequence lays out once on each branch.","title":"Arm"},"kind":{"description":"`email`, `linkedin_connection` or `linkedin_withdraw`.","title":"Kind","type":"string"},"note":{"default":"","deprecated":true,"description":"Always empty: tailoring writes no per-step notes any more. Read `prompt`.","title":"Note","type":"string"},"prompt":{"description":"The instruction the step's message is written from, as tailoring rewrote it for the company; empty on a step that carries no words.","title":"Prompt","type":"string"},"title":{"title":"Title","type":"string"},"wait_days":{"description":"Days after the step before; 0 on the first.","title":"Wait Days","type":"integer"},"window_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"On a connection request: days it waits for an answer. Null on other steps.","title":"Window Days"}},"required":["title","kind","wait_days","prompt"],"title":"SequenceProposalStepSchema","type":"object"},"SequencePurgedContextSchema":{"description":"Context for a deletion for good from Trash.","properties":{"name":{"default":"","title":"Name","type":"string"},"type":{"const":"purged","default":"purged","title":"Type","type":"string"}},"title":"SequencePurgedContextSchema","type":"object"},"SequenceReadSchema":{"properties":{"audience_table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Audience Table Id"},"audience_view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Audience View Id"},"bcc_addresses":{"description":"Blind copies on every email this sequence sends.","items":{"type":"string"},"title":"Bcc Addresses","type":"array"},"cc_addresses":{"description":"Addresses copied on every email this sequence sends.","items":{"type":"string"},"title":"Cc Addresses","type":"array"},"column_mapping":{"$ref":"#/components/schemas/ColumnMappingSchema"},"connection_requests_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connection Requests Sent"},"connections_accepted":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Invitations from this sequence confirmed accepted. With connection_requests_sent this yields the acceptance rate.","title":"Connections Accepted"},"contacts_added":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Rollup, list reads only. None when the list's stats have never been built and could not be built on this request (for example, another request was building them). Show a zero state, not a fake 0.","title":"Contacts Added"},"contacts_failed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contacts Failed"},"contacts_finished":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contacts Finished"},"contacts_in_progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contacts In Progress"},"contacts_not_started":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A draft's contacts, who start when it launches (rollup, list reads only).","title":"Contacts Not Started"},"continuous_enrolment":{"default":false,"description":"TRUE keeps the audience live: rows added to the table later enrol on their own, and rows that leave it stop. FALSE (the default for a new sequence) freezes the audience after launch; Add to sequence still adds rows to it by hand.","title":"Continuous Enrolment","type":"boolean"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"edges":{"items":{"$ref":"#/components/schemas/SequenceEdgeSchema"},"title":"Edges","type":"array"},"email_approval_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`manual` requires approval; `confident` adds approval for uncertain AI-written emails; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.","title":"Email Approval Mode"},"emails_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Emails Sent"},"hold":{"anyOf":[{"$ref":"#/components/schemas/SequenceListHoldSchema"},{"type":"null"}],"description":"List reads only, read live on every request (never from the cached stats): on a running sequence nobody on which can move, the worst reason holding them (as GET /sequences/{id}/holds/ names it). Null while anybody moves and on any other status."},"id":{"format":"uuid","title":"Id","type":"string"},"is_favorite":{"default":false,"description":"List reads only: whether the person asking starred the sequence. Their own, never a teammate's; always false for an API key.","title":"Is Favorite","type":"boolean"},"last_synced_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the audience-enrolment diff last completed. None until the first sync (launch runs one inline). The Audience tab shows this plus a manual trigger, never a background job the user cannot see.","title":"Last Synced At"},"last_viewed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"List reads only: when the person asking last opened the sequence; null when they never have, and for an API key.","title":"Last Viewed At"},"launched_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Launched At"},"linkedin_approval_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`manual` requires approval; `confident` adds approval for uncertain AI-written LinkedIn steps; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.","title":"Linkedin Approval Mode"},"linkedin_check_max_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"deprecated":true,"description":"Retired. Acceptance checks now use the service-managed interval.","title":"Linkedin Check Max Seconds"},"linkedin_check_min_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"deprecated":true,"description":"Retired. Acceptance checks now use the service-managed interval.","title":"Linkedin Check Min Seconds"},"linkedin_messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linkedin Messages Sent"},"multithreading":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Multithreading"},"name":{"title":"Name","type":"string"},"opportunity_values":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"description":"Dollars per outcome label; None = tracking off.","title":"Opportunity Values"},"opt_out_footer_text":{"title":"Opt Out Footer Text","type":"string"},"outbound_agent_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The sequence's outbound agent: the writer of every agent-written step and of its replies. Read and configure it under /outbound-agents/{id}/.","title":"Outbound Agent Id"},"pause_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pause Reason"},"plain_text_only":{"default":true,"description":"TRUE (recommended) sends no formatting: the bold, italic and link marks are stripped and the email reads as plain text; FALSE renders them. Either way the email carries an HTML part laid out line for line, which keeps its spacing exactly, beside a matching text part.","title":"Plain Text Only","type":"boolean"},"positive":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Threads labelled positive (rollup, list reads only).","title":"Positive"},"positive_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Positive Rate"},"replies":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Distinct contacts who replied: reply_rate's numerator.","title":"Replies"},"reply_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reply Rate"},"sender_profile_ids":{"description":"Only meaningful on list reads: the sequence's senders by id, in the same order as sender_profile_names.","items":{"format":"uuid","type":"string"},"title":"Sender Profile Ids","type":"array"},"sender_profile_names":{"description":"Only meaningful on list reads: the names of the sequence's senders.","items":{"type":"string"},"title":"Sender Profile Names","type":"array"},"senders_ready":{"default":true,"description":"Only meaningful on list reads: False when the sequence has senders but none currently has a connected mailbox.","title":"Senders Ready","type":"boolean"},"sending_priority":{"default":"new_contacts","description":"Who gets scarce capacity first: new_contacts or follow_ups.","title":"Sending Priority","type":"string"},"sending_window":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sending Window"},"sending_window_problem":{"anyOf":[{"$ref":"#/components/schemas/SendingWindowProblemSchema"},{"type":"null"}],"description":"Set when the saved sending_window breaks a rule a save now refuses, which only a window saved before those rules can. It still sends on it as stored: an unknown timezone is read as UTC, and no open day sends at any hour. Fix it by saving a valid sending_window."},"spending_limit_tenths":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Spending Limit Tenths"},"status":{"$ref":"#/components/schemas/SequenceStatus"},"status_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Status Column Id"},"step_count":{"title":"Step Count","type":"integer"},"steps":{"items":{"$ref":"#/components/schemas/SequenceStepSchema-Output"},"title":"Steps","type":"array"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","status","audience_table_id","audience_view_id","column_mapping","status_column_id","sending_window","multithreading","opt_out_footer_text","launched_at","pause_reason","created_at","updated_at","steps","edges","step_count"],"title":"SequenceReadSchema","type":"object"},"SequenceRestoreReadSchema":{"description":"A sequence taken out of Trash, and the contacts it could not take back.","properties":{"contacts_held_elsewhere":{"description":"Contacts another sequence took while this one was in Trash. They stay stopped here (Stopped in Trash). One who replied, bounced or left the audience stops for that instead, and is not counted. A draft holds nobody, so it takes every contact back and this is 0. The rest are taken back where they stood, in the background, a moment after this answers.","title":"Contacts Held Elsewhere","type":"integer"},"sequence":{"$ref":"#/components/schemas/SequenceReadSchema"}},"required":["sequence","contacts_held_elsewhere"],"title":"SequenceRestoreReadSchema","type":"object"},"SequenceRestoredContextSchema":{"description":"Context for a restore from Trash, and how many contacts stayed stopped.","properties":{"contacts_held_elsewhere":{"default":0,"title":"Contacts Held Elsewhere","type":"integer"},"name":{"default":"","title":"Name","type":"string"},"type":{"const":"restored","default":"restored","title":"Type","type":"string"}},"title":"SequenceRestoredContextSchema","type":"object"},"SequenceResumedContextSchema":{"description":"Context for a resume.","properties":{"name":{"default":"","title":"Name","type":"string"},"type":{"const":"resumed","default":"resumed","title":"Type","type":"string"}},"title":"SequenceResumedContextSchema","type":"object"},"SequenceSendersPutSchema":{"properties":{"sender_profile_ids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"title":"Sender Profile Ids","type":"array"}},"required":["sender_profile_ids"],"title":"SequenceSendersPutSchema","type":"object"},"SequenceSendersReadSchema":{"properties":{"sender_profile_ids":{"items":{"format":"uuid","type":"string"},"title":"Sender Profile Ids","type":"array"}},"required":["sender_profile_ids"],"title":"SequenceSendersReadSchema","type":"object"},"SequenceStartProgressReadSchema":{"description":"How far a launch's start has got; cheap enough to poll every two seconds.","properties":{"starting":{"description":"Contacts due now plus those being worked on. The start is over when this is 0.","title":"Starting","type":"integer"},"tasks_waiting":{"description":"This sequence's tasks waiting on a person's approval.","title":"Tasks Waiting","type":"integer"}},"required":["starting","tasks_waiting"],"title":"SequenceStartProgressReadSchema","type":"object"},"SequenceStatus":{"description":"Lifecycle of a sequence.\n\nDRAFT until launch; RUNNING sequences are locked against structural edits\n(pause → edit → resume); PAUSED stops scheduling while leaving every\nenrolment exactly where it is; COMPLETED is terminal.","enum":["draft","running","paused","completed"],"title":"SequenceStatus","type":"string"},"SequenceStepKind":{"description":"What a graph node does.\n\nThe LINKEDIN_* kinds do not send anything themselves. They enqueue browser\nwork and park the contact until it runs, because the action happens in the\ncustomer's own browser and that browser may be closed.\n\nEvery kind here is something the product can carry out end to end. There is\ndeliberately no phone-call or text-message kind: the engine cannot dial or\ntext, and a step it can only hand to a person to do elsewhere is a to-do\nlist wearing a sequence's clothes, not a channel this product supports.","enum":["message","condition","linkedin_profile_view","linkedin_connection_request","linkedin_message","linkedin_inmail","linkedin_withdraw_invitation","linkedin_follow","linkedin_like_post"],"title":"SequenceStepKind","type":"string"},"SequenceStepSchema-Input":{"properties":{"agent_prompt_key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Read-only: the agent's slot for this step's prompt (the step's id). Set by the server on every agent-written step; ignored on write.","title":"Agent Prompt Key"},"agent_subject":{"default":false,"description":"On an agent-written email that starts a thread: the agent writes the subject line too, and `subject_segments` is ignored. Off, the typed subject is sent. Ignored on a reply and on written steps.","title":"Agent Subject","type":"boolean"},"authoring":{"$ref":"#/components/schemas/StepAuthoring","default":"written","description":"Who writes the words. 'written' sends the subject and body below; 'agent' has the sequence's outbound agent write them for each contact from `prompt`, the contact's row and the workspace's business context, priced per contact. An email, a connection note, a LinkedIn message or an InMail."},"body_segments":{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"title":"Body Segments","type":"array"},"condition_kind":{"anyOf":[{"$ref":"#/components/schemas/SequenceConditionKind"},{"type":"null"}]},"condition_window_days":{"anyOf":[{"maximum":90.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"How many days the step waits for its answer. On a check that waits (Replied?, Email bounced?), its window. On a connection request, how long it waits for the request to be accepted before the contact goes down its `not_accepted` branch: null is saved as 14, and a change holds every contact already waiting to the new window.","title":"Condition Window Days"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"$ref":"#/components/schemas/SequenceStepKind"},"position":{"default":0,"minimum":0.0,"title":"Position","type":"integer"},"prompt":{"default":"","description":"What the agent is asked to write at this step. Stored on the agent, not the step, and saved with the graph: this is the one way to change it.","maxLength":4000,"title":"Prompt","type":"string"},"reply_to_step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The earlier email step this email replies to: it goes out under that step's send to the contact (Re: its subject, In-Reply-To its Message-ID), from the mailbox that sent it. Must be an email step that comes before this one on the graph. Null starts a new thread. Only on email steps.","title":"Reply To Step Id"},"requires_approval":{"default":false,"description":"Hold this step for approval even when its channel would run on its own. One-way: true adds an approval, false never removes the one the channel's resolved mode already wants.","title":"Requires Approval","type":"boolean"},"subject_segments":{"anyOf":[{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"type":"array"},{"type":"null"}],"description":"The subject of an email that starts a thread. Ignored on a reply (`reply_to_step_id`), whose subject is the thread's, and on an email whose subject the agent writes (`agent_subject`). An email that starts a thread with neither fails preflight until a subject is added. A blank subject on an email after another one, with no `reply_to_step_id`, is saved as a reply to the nearest earlier email, which is what it used to mean.","title":"Subject Segments"},"title":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"description":"What the step is called on its card, in the customer's words: set by the library campaign that laid it out, or by whoever saves the graph. Null names it by its place in the cadence (Opener, New angle, Break-up). Sending the stored title back, or leaving it out, keeps it while the step keeps its kind and who writes it; a different title renames the step, and an empty one clears the name.","title":"Title"},"wait_amount":{"default":0,"maximum":365.0,"minimum":0.0,"title":"Wait Amount","type":"integer"},"wait_unit":{"$ref":"#/components/schemas/SequenceWaitUnit","default":"days"}},"required":["id","kind"],"title":"SequenceStepSchema","type":"object"},"SequenceStepSchema-Output":{"properties":{"agent_prompt_key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Read-only: the agent's slot for this step's prompt (the step's id). Set by the server on every agent-written step; ignored on write.","title":"Agent Prompt Key"},"agent_subject":{"default":false,"description":"On an agent-written email that starts a thread: the agent writes the subject line too, and `subject_segments` is ignored. Off, the typed subject is sent. Ignored on a reply and on written steps.","title":"Agent Subject","type":"boolean"},"authoring":{"$ref":"#/components/schemas/StepAuthoring","default":"written","description":"Who writes the words. 'written' sends the subject and body below; 'agent' has the sequence's outbound agent write them for each contact from `prompt`, the contact's row and the workspace's business context, priced per contact. An email, a connection note, a LinkedIn message or an InMail."},"body_segments":{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"title":"Body Segments","type":"array"},"condition_kind":{"anyOf":[{"$ref":"#/components/schemas/SequenceConditionKind"},{"type":"null"}]},"condition_window_days":{"anyOf":[{"maximum":90.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"How many days the step waits for its answer. On a check that waits (Replied?, Email bounced?), its window. On a connection request, how long it waits for the request to be accepted before the contact goes down its `not_accepted` branch: null is saved as 14, and a change holds every contact already waiting to the new window.","title":"Condition Window Days"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"$ref":"#/components/schemas/SequenceStepKind"},"position":{"default":0,"minimum":0.0,"title":"Position","type":"integer"},"prompt":{"default":"","description":"What the agent is asked to write at this step. Stored on the agent, not the step, and saved with the graph: this is the one way to change it.","maxLength":4000,"title":"Prompt","type":"string"},"reply_to_step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The earlier email step this email replies to: it goes out under that step's send to the contact (Re: its subject, In-Reply-To its Message-ID), from the mailbox that sent it. Must be an email step that comes before this one on the graph. Null starts a new thread. Only on email steps.","title":"Reply To Step Id"},"requires_approval":{"default":false,"description":"Hold this step for approval even when its channel would run on its own. One-way: true adds an approval, false never removes the one the channel's resolved mode already wants.","title":"Requires Approval","type":"boolean"},"subject_segments":{"anyOf":[{"items":{"$ref":"#/components/schemas/TemplateSegmentSchema"},"type":"array"},{"type":"null"}],"description":"The subject of an email that starts a thread. Ignored on a reply (`reply_to_step_id`), whose subject is the thread's, and on an email whose subject the agent writes (`agent_subject`). An email that starts a thread with neither fails preflight until a subject is added. A blank subject on an email after another one, with no `reply_to_step_id`, is saved as a reply to the nearest earlier email, which is what it used to mean.","title":"Subject Segments"},"title":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"description":"What the step is called on its card, in the customer's words: set by the library campaign that laid it out, or by whoever saves the graph. Null names it by its place in the cadence (Opener, New angle, Break-up). Sending the stored title back, or leaving it out, keeps it while the step keeps its kind and who writes it; a different title renames the step, and an empty one clears the name.","title":"Title"},"wait_amount":{"default":0,"maximum":365.0,"minimum":0.0,"title":"Wait Amount","type":"integer"},"wait_unit":{"$ref":"#/components/schemas/SequenceWaitUnit","default":"days"}},"required":["id","kind"],"title":"SequenceStepSchema","type":"object"},"SequenceTailorSchema":{"description":"What a person asks of a tailoring: their own words, and a campaign.","properties":{"campaign_key":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"A campaign from the library to run, by key (see the outbound presets' campaigns). Omitted, tailoring chooses the one that fits the audience best.","title":"Campaign Key"},"intent":{"default":"","description":"What the campaign is for, in the person's own words: an event, a launch, an offer, who to reach. The one part of a campaign an email may state as fact.","maxLength":500,"title":"Intent","type":"string"}},"title":"SequenceTailorSchema","type":"object"},"SequenceTailoringJobReadSchema":{"description":"One tailoring job: how far it got and what it chose.","properties":{"campaign_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Key"},"campaign_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Name"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"finished_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished At"},"id":{"format":"uuid","title":"Id","type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why it ended as it did, as a code: daily_cap, no_context, guard, launched, edited, and the like.","title":"Reason"},"status":{"description":"queued, running, applied, failed, skipped or superseded; ready_for_review and kept_stock only on jobs from before tailoring rewrote steps.","title":"Status","type":"string"},"steps":{"description":"What the run did, one step per piece of work once it is done: the business context and audience it read, the campaign it chose, the steps it rewrote. Grows while the job is in flight; kept once it settles.","items":{"$ref":"#/components/schemas/AiStep"},"maxItems":40,"title":"Steps","type":"array"},"trigger":{"title":"Trigger","type":"string"}},"required":["id","status","trigger","reason","campaign_key","campaign_name","created_at","finished_at"],"title":"SequenceTailoringJobReadSchema","type":"object"},"SequenceTailoringReadSchema":{"description":"Where a sequence's tailoring stands: the campaign it runs, and its newest job.","properties":{"campaign":{"anyOf":[{"$ref":"#/components/schemas/SequenceCampaignReadSchema"},{"type":"null"}]},"in_flight":{"description":"A job is still working; launch waits for it.","title":"In Flight","type":"boolean"},"job":{"anyOf":[{"$ref":"#/components/schemas/SequenceTailoringJobReadSchema"},{"type":"null"}]}},"required":["campaign","job","in_flight"],"title":"SequenceTailoringReadSchema","type":"object"},"SequenceTemplateCreateSchema":{"properties":{"name":{"maxLength":200,"minLength":1,"title":"Name","type":"string"},"sequence_id":{"format":"uuid","title":"Sequence Id","type":"string"}},"required":["sequence_id","name"],"title":"SequenceTemplateCreateSchema","type":"object"},"SequenceTemplateReadSchema":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"sequence":{"$ref":"#/components/schemas/SequenceReadSchema"}},"required":["id","name","created_at","sequence"],"title":"SequenceTemplateReadSchema","type":"object"},"SequenceTrainingActionSchema":{"properties":{"expected_revision":{"minimum":1.0,"title":"Expected Revision","type":"integer"}},"required":["expected_revision"],"title":"SequenceTrainingActionSchema","type":"object"},"SequenceTrainingAdoptSchema":{"properties":{"record_ids":{"description":"The audience rows whose threads were already written as previews, between one and ten different ones.","items":{"format":"uuid","type":"string"},"maxItems":10,"minItems":1,"title":"Record Ids","type":"array"}},"required":["record_ids"],"title":"SequenceTrainingAdoptSchema","type":"object"},"SequenceTrainingApplySchema":{"description":"Which of the proposed changes to take, and whether to draft again with them.","properties":{"expected_revision":{"minimum":1.0,"title":"Expected Revision","type":"integer"},"rewrite":{"default":false,"title":"Rewrite","type":"boolean"},"slot_keys":{"anyOf":[{"items":{"type":"string"},"maxItems":100,"type":"array"},{"type":"null"}],"title":"Slot Keys"}},"required":["expected_revision"],"title":"SequenceTrainingApplySchema","type":"object"},"SequenceTrainingAudienceContactSchema":{"properties":{"label":{"title":"Label","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"}},"required":["record_id","label"],"title":"SequenceTrainingAudienceContactSchema","type":"object"},"SequenceTrainingAudienceSchema":{"properties":{"contacts":{"items":{"$ref":"#/components/schemas/SequenceTrainingAudienceContactSchema"},"title":"Contacts","type":"array"},"has_more":{"title":"Has More","type":"boolean"}},"required":["contacts","has_more"],"title":"SequenceTrainingAudienceSchema","type":"object"},"SequenceTrainingContactFieldSchema":{"properties":{"name":{"title":"Name","type":"string"},"value":{"title":"Value","type":"string"}},"required":["name","value"],"title":"SequenceTrainingContactFieldSchema","type":"object"},"SequenceTrainingContactReadSchema":{"properties":{"context":{"additionalProperties":{"type":"string"},"title":"Context","type":"object"},"fields":{"description":"The contact's own columns as the run froze them, read the way the approval queue lists a contact: each fact once, a whole-record column opened into its facts.","items":{"$ref":"#/components/schemas/SequenceTrainingContactFieldSchema"},"title":"Fields","type":"array"},"label":{"title":"Label","type":"string"},"messages":{"items":{"$ref":"#/components/schemas/SequenceTrainingMessageReadSchema"},"title":"Messages","type":"array"},"note":{"title":"Note","type":"string"},"notes":{"description":"Every note given on this thread, oldest first.","items":{"$ref":"#/components/schemas/SequenceTrainingNoteReadSchema"},"title":"Notes","type":"array"},"notice":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The agent's answer to a note that needed no change to its instructions, in its own sentence: usually a note about this contact's own facts.","title":"Notice"},"profile_mismatch":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What the contact's LinkedIn profile says that their row does not, usually a job change the row has not caught up with, as one sentence: 'LinkedIn says Operations Leader at Chamber Media; the row says Sealed.' Null when they agree or no profile was read.","title":"Profile Mismatch"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The sender these messages were written as, when the run chose one: where a message held because this sender always asks is changed.","title":"Sender Profile Id"},"verdict":{"anyOf":[{"$ref":"#/components/schemas/ContactReviewVerdict"},{"type":"null"}]}},"required":["record_id","label","context","fields","messages","verdict","note"],"title":"SequenceTrainingContactReadSchema","type":"object"},"SequenceTrainingFeedbackSchema":{"description":"One note on a contact's thread: what should change, in the person's words.","properties":{"expected_revision":{"minimum":1.0,"title":"Expected Revision","type":"integer"},"note":{"description":"What should change in this contact's messages. The agent works out the change to its instructions the note asks for and writes the contact's whole thread again with it; nothing about the agent changes until the rewrite is kept.","maxLength":4000,"minLength":1,"title":"Note","type":"string"}},"required":["expected_revision","note"],"title":"SequenceTrainingFeedbackSchema","type":"object"},"SequenceTrainingLatestSchema":{"properties":{"matches_sequence":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the session was written against the sequence's steps, audience and column mapping as they are now. Null when there is no session.","title":"Matches Sequence"},"session":{"anyOf":[{"$ref":"#/components/schemas/SequenceTrainingReadSchema"},{"type":"null"}]}},"required":["session"],"title":"SequenceTrainingLatestSchema","type":"object"},"SequenceTrainingMessageFeedbackSchema":{"properties":{"edited_body":{"anyOf":[{"maxLength":20000,"type":"string"},{"type":"null"}],"title":"Edited Body"},"edited_subject":{"anyOf":[{"maxLength":1000,"type":"string"},{"type":"null"}],"title":"Edited Subject"},"note":{"default":"","maxLength":4000,"title":"Note","type":"string"},"step_id":{"format":"uuid","title":"Step Id","type":"string"}},"required":["step_id"],"title":"SequenceTrainingMessageFeedbackSchema","type":"object"},"SequenceTrainingMessageReadSchema":{"properties":{"authored":{"title":"Authored","type":"boolean"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"conditional":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conditional"},"edited_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edited Body"},"edited_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edited Subject"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"facts_used":{"items":{"type":"string"},"title":"Facts Used","type":"array"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"title":"Kind","type":"string"},"looks_good":{"default":false,"description":"These very words are marked Looks good, so they are what sends: by the thread's Looks good, or on their own from the Builder, which marks one email at a time.","title":"Looks Good","type":"boolean"},"note":{"title":"Note","type":"string"},"previous_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Body"},"previous_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Subject"},"proposed_body":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The words the rewrite waiting on this contact wrote.","title":"Proposed Body"},"proposed_error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why the rewrite could not write this message.","title":"Proposed Error"},"proposed_send":{"anyOf":[{"$ref":"#/components/schemas/SequenceTrainingSendSchema"},{"type":"null"}],"description":"The rewrite's words, read as ``send`` reads the words shown."},"proposed_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The subject the message sends with once the rewrite waiting on this contact is kept: the rewrite's own, or the subject typed on the step, which a rewrite keeps.","title":"Proposed Subject"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"reply_to_step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The step whose thread this message replies in, or null when it opens a thread of its own.","title":"Reply To Step Id"},"send":{"anyOf":[{"$ref":"#/components/schemas/SequenceTrainingSendSchema"},{"type":"null"}],"description":"Whether the agent's words would send on their own or wait for approval, under the sequence's settings as they stand. Null for a message a person typed, one not written, or when nothing would send it (no sender, no LinkedIn account)."},"steps":{"items":{"$ref":"#/components/schemas/AiStep"},"title":"Steps","type":"array"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"timing":{"title":"Timing","type":"string"},"title":{"title":"Title","type":"string"}},"required":["id","title","timing","kind","authored","conditional","subject","body","error","note","edited_subject","edited_body","previous_subject","previous_body","reasoning","facts_used","steps","reply_to_step_id"],"title":"SequenceTrainingMessageReadSchema","type":"object"},"SequenceTrainingNextSchema":{"description":"The contact the AI writing tab shows after the one on screen.","properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Their name, as the training picker shows it.","title":"Label"},"record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The next contact in the audience's order that nobody has judged in this run, has no words pinned already and can be reached. Null when there is none.","title":"Record Id"}},"required":["record_id","label"],"title":"SequenceTrainingNextSchema","type":"object"},"SequenceTrainingNoteReadSchema":{"description":"One note given on a contact's thread, and where it stands.","properties":{"note":{"title":"Note","type":"string"},"state":{"$ref":"#/components/schemas/FeedbackRoundState","description":"`pending` its rewrite is being worked out or waits to be kept; `applied` kept, so the agent learned it; `discarded` its rewrite was discarded; `settled` the agent answered that nothing needed to change, or a verdict was given instead."}},"required":["note","state"],"title":"SequenceTrainingNoteReadSchema","type":"object"},"SequenceTrainingPreviewsReadSchema":{"description":"The writing check once it keeps threads already written, and which of them to write again.","properties":{"session":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"},"write_again":{"description":"Contacts whose kept thread was written before the plain-words check and uses jargon the writing rules forbid or a business context sentence word for word. Writing them again (the step preview with fresh) replaces those words; the AI writing tab shows the thread as it is meanwhile.","items":{"format":"uuid","type":"string"},"title":"Write Again","type":"array"}},"required":["session","write_again"],"title":"SequenceTrainingPreviewsReadSchema","type":"object"},"SequenceTrainingProgressSchema":{"description":"How training on this sequence is going, counted across the run.","properties":{"fixed":{"description":"Lessons kept in this run.","title":"Fixed","type":"integer"},"in_a_row":{"description":"Contacts given Looks good, with no note, since the last note.","title":"In A Row","type":"integer"},"lessons":{"description":"Each lesson kept, in the agent's own sentence, oldest first.","items":{"type":"string"},"title":"Lessons","type":"array"},"ready":{"description":"Whether in_a_row has reached ready_after.","title":"Ready","type":"boolean"},"ready_after":{"description":"How many in a row make the agent ready to send on its own.","title":"Ready After","type":"integer"},"reviewed":{"description":"Contacts given Looks good or a note in this run.","title":"Reviewed","type":"integer"}},"required":["reviewed","fixed","in_a_row","ready_after","ready","lessons"],"title":"SequenceTrainingProgressSchema","type":"object"},"SequenceTrainingReadSchema":{"properties":{"agent_id":{"format":"uuid","title":"Agent Id","type":"string"},"applied_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Applied Version"},"base_version":{"title":"Base Version","type":"integer"},"contacts":{"items":{"$ref":"#/components/schemas/SequenceTrainingContactReadSchema"},"title":"Contacts","type":"array"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"id":{"format":"uuid","title":"Id","type":"string"},"note_waiting":{"default":false,"description":"A note was given while another contact was being written: its rewrite is worked out as soon as that write lands.","title":"Note Waiting","type":"boolean"},"progress":{"$ref":"#/components/schemas/SequenceTrainingProgressSchema"},"proposal":{"anyOf":[{"$ref":"#/components/schemas/ContactTrainingProposal"},{"type":"null"}]},"reviewed_ids":{"description":"Every contact given Looks good or a note in this run, including ones that left the run to make room.","items":{"format":"uuid","type":"string"},"title":"Reviewed Ids","type":"array"},"revision":{"title":"Revision","type":"integer"},"status":{"$ref":"#/components/schemas/ContactTrainingStatus"},"steps":{"items":{"$ref":"#/components/schemas/AiStep"},"title":"Steps","type":"array"}},"required":["id","agent_id","status","revision","base_version","contacts","proposal","error","applied_version","created_at","progress"],"title":"SequenceTrainingReadSchema","type":"object"},"SequenceTrainingReviewSchema":{"properties":{"expected_revision":{"minimum":1.0,"title":"Expected Revision","type":"integer"},"messages":{"items":{"$ref":"#/components/schemas/SequenceTrainingMessageFeedbackSchema"},"maxItems":100,"title":"Messages","type":"array"},"note":{"default":"","maxLength":4000,"title":"Note","type":"string"},"verdict":{"$ref":"#/components/schemas/ContactReviewVerdict"}},"required":["expected_revision","verdict"],"title":"SequenceTrainingReviewSchema","type":"object"},"SequenceTrainingSendSchema":{"description":"Whether a message would leave on its own when its turn comes, and if not, why.","properties":{"alone":{"description":"True when the send would let these words go without a person; false when they would wait for approval in Tasks.","title":"Alone","type":"boolean"},"doubt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When the words themselves hold the message (the agent was not confident, knew too little, or a check found something): one sentence saying what. Null otherwise.","title":"Doubt"},"reason":{"anyOf":[{"$ref":"#/components/schemas/AskReason"},{"type":"null"}],"description":"Why they would wait, in the approval queue's own reasons; null when alone."}},"required":["alone","reason"],"title":"SequenceTrainingSendSchema","type":"object"},"SequenceTrainingStartSchema":{"properties":{"close_open":{"default":false,"description":"Close the sequence's open training session first, keeping its reviews, and start a new one. Without it the contacts join the open session, so the ones already written stay; a contact already in it is written again. Still refused while that session is writing.","title":"Close Open","type":"boolean"},"record_ids":{"items":{"format":"uuid","type":"string"},"maxItems":10,"minItems":1,"title":"Record Ids","type":"array"}},"required":["record_ids"],"title":"SequenceTrainingStartSchema","type":"object"},"SequenceTrashedContextSchema":{"description":"Context for a move to Trash.","properties":{"name":{"default":"","title":"Name","type":"string"},"type":{"const":"trashed","default":"trashed","title":"Type","type":"string"}},"title":"SequenceTrashedContextSchema","type":"object"},"SequenceUpdateSchema":{"properties":{"bcc_addresses":{"anyOf":[{"items":{"type":"string"},"maxItems":5,"type":"array"},{"type":"null"}],"title":"Bcc Addresses"},"cc_addresses":{"anyOf":[{"items":{"type":"string"},"maxItems":5,"type":"array"},{"type":"null"}],"title":"Cc Addresses"},"continuous_enrolment":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Continuous Enrolment"},"email_approval_mode":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"title":"Email Approval Mode"},"expected_updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The updated_at the client last saw; a stale value is refused with 409 instead of clobbering a concurrent editor.","title":"Expected Updated At"},"linkedin_approval_mode":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"title":"Linkedin Approval Mode"},"linkedin_check_max_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"deprecated":true,"description":"Retired. Acceptance checks now use the service-managed interval.","title":"Linkedin Check Max Seconds"},"linkedin_check_min_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"deprecated":true,"description":"Retired. Acceptance checks now use the service-managed interval.","title":"Linkedin Check Min Seconds"},"multithreading":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Multithreading"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"title":"Name"},"opportunity_values":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Opportunity Values"},"opt_out_footer_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opt Out Footer Text"},"plain_text_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Plain Text Only"},"sending_priority":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"title":"Sending Priority"},"sending_window":{"anyOf":[{"$ref":"#/components/schemas/SendingWindowSchema"},{"type":"null"}],"description":"When the sequence may send; replaces the whole window. Null clears it, which sends at any hour with automatic spacing. Leave it out to keep the one it has."},"spending_limit_tenths":{"anyOf":[{"maximum":1000000000.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Spending Limit Tenths"}},"title":"SequenceUpdateSchema","type":"object"},"SequenceUserPrefsReadSchema":{"description":"One person's relationship with one sequence.\n\nPer PERSON: two people in the same organisation are meant to disagree about\nwhat they have starred.","properties":{"is_favorite":{"description":"Whether this person starred the sequence.","title":"Is Favorite","type":"boolean"},"last_viewed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this person last opened the sequence; null means never.","title":"Last Viewed At"}},"required":["is_favorite","last_viewed_at"],"title":"SequenceUserPrefsReadSchema","type":"object"},"SequenceWaitUnit":{"enum":["days","hours"],"title":"SequenceWaitUnit","type":"string"},"SequenceWriteFromColumnReadSchema":{"description":"One audience column the agent writes from as an angle the team prepared.","properties":{"column_id":{"description":"The column's id; the agent skips it while this id is in its config's write_from_excluded_column_ids.","format":"uuid","title":"Column Id","type":"string"},"name":{"description":"The column's name, as the table's header shows it.","title":"Name","type":"string"}},"required":["column_id","name"],"title":"SequenceWriteFromColumnReadSchema","type":"object"},"SequenceWriteFromReadSchema":{"description":"The audience columns whose answers the agent writes from, removed ones included.","properties":{"columns":{"description":"The research and AI columns of the audience table (a Use AI column, a built-in research agent, or a field promoted out of one), in table order. Empty with no audience.","items":{"$ref":"#/components/schemas/SequenceWriteFromColumnReadSchema"},"title":"Columns","type":"array"}},"required":["columns"],"title":"SequenceWriteFromReadSchema","type":"object"},"ServerErrorResponse":{"properties":{"detail":{"description":"The detail of why the server returned an error.","title":"Detail","type":"string"}},"required":["detail"],"title":"ServerErrorResponse","type":"object"},"SetProfileMailboxesSchema":{"properties":{"mailbox_ids":{"description":"The exact set of mailboxes this profile sends from.","items":{"format":"uuid","type":"string"},"title":"Mailbox Ids","type":"array"}},"required":["mailbox_ids"],"title":"SetProfileMailboxesSchema","type":"object"},"SharedTableTemplateColumnSchema":{"description":"One column of a published template.","properties":{"column_type":{"$ref":"#/components/schemas/TableColumnType"},"definition":{"$ref":"#/components/schemas/TableColumnDefinition-Output","description":"The column's configuration, verbatim: the recipe being shared."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Author's note; null when unset.","title":"Description"},"display_name":{"title":"Display Name","type":"string"},"holds":{"description":"What this column holds, in words (\"An email address\", \"A date\"). Stands in for an example value: a template never carries one of the owner's cells.","title":"Holds","type":"string"},"kind":{"$ref":"#/components/schemas/TableColumnKind"},"sample_value":{"description":"Always null. Kept so older callers keep parsing; a template never serves a real row's value. Read `holds` instead.","title":"Sample Value","type":"null"}},"required":["display_name","description","kind","column_type","definition","holds"],"title":"SharedTableTemplateColumnSchema","type":"object"},"SharedTableTemplateSchema":{"description":"A table's published shape.\n\nDeliberately NOT a `TableReadSchema`: this is served without sign-in, so\nevery field on it is a decision rather than an inheritance. Row counts,\norg, timestamps and run settings are all absent because none of them are\npart of a recipe.","properties":{"columns":{"items":{"$ref":"#/components/schemas/SharedTableTemplateColumnSchema"},"title":"Columns","type":"array"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name","description","columns"],"title":"SharedTableTemplateSchema","type":"object"},"SignalCompaniesQuerySchema":{"description":"Filters for a company buying-signal search.","properties":{"company_domains":{"description":"Only signals from these company domains. Up to 100.","items":{"type":"string"},"maxItems":100,"title":"Company Domains","type":"array"},"content_competitors_mentioned":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Competitors named in the text a signal was drawn from. Exact company names."},"content_initiatives":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Plans and projects named in the text a signal was drawn from."},"content_keywords":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Match the words in the text a signal was drawn from. Only the social signal types carry text, and the data source refuses a content filter beside any other type."},"content_pain_points":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Problems named in the text a signal was drawn from."},"content_tech_mentioned":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Technologies named in the text a signal was drawn from. Exact product names: Salesforce matches, Sales does not."},"detected_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only signals detected on or after this day, as YYYY-MM-DD.","title":"Detected After"},"detected_before":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only signals detected on or before this day, as YYYY-MM-DD.","title":"Detected Before"},"employee_count":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The company's employee count."},"industries":{"description":"Only signals from companies in these industries. Up to 25, each matched as a case-insensitive substring of the data source's own industry labels; a value matching none of them is refused upstream.","items":{"type":"string"},"maxItems":25,"title":"Industries","type":"array"},"revenue":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Annual revenue in US dollars. The data source filters by named revenue band, so each bound is mapped to the band that contains it."},"signal_subtypes":{"description":"At most one narrower kind within the chosen signal, where it offers any. Optional: a signal with no subtypes sends none.","items":{"type":"string"},"maxItems":1,"title":"Signal Subtypes","type":"array"},"signal_types":{"description":"Which buying signal to look for: exactly one. It is required, and no other filter can anchor a signals search on its own.","items":{"type":"string"},"maxItems":1,"title":"Signal Types","type":"array"},"signals_per_entity":{"anyOf":[{"maximum":100.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"How many of each company's or person's most recent matching signals to attach to its row; 25 when unset. Each company or person is one row however many signals it has, so this changes neither how many rows a search adds nor what they cost, and `signal_count` still gives the total.","title":"Signals Per Entity"}},"title":"SignalCompaniesQuerySchema","type":"object"},"SignalPeopleQuerySchema":{"description":"Filters for a person activity-signal search.","properties":{"company_domains":{"description":"Only signals from these company domains. Up to 100.","items":{"type":"string"},"maxItems":100,"title":"Company Domains","type":"array"},"content_competitors_mentioned":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Competitors named in the text a signal was drawn from. Exact company names."},"content_initiatives":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Plans and projects named in the text a signal was drawn from."},"content_keywords":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Match the words in the text a signal was drawn from. Only the social signal types carry text, and the data source refuses a content filter beside any other type."},"content_pain_points":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Problems named in the text a signal was drawn from."},"content_tech_mentioned":{"anyOf":[{"$ref":"#/components/schemas/ContentFilterSchema"},{"type":"null"}],"description":"Technologies named in the text a signal was drawn from. Exact product names: Salesforce matches, Sales does not."},"department":{"description":"Only people in these departments, from the data source's own list of eighteen. Any other value is refused.","items":{"type":"string"},"maxItems":20,"title":"Department","type":"array"},"detected_after":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only signals detected on or after this day, as YYYY-MM-DD.","title":"Detected After"},"detected_before":{"anyOf":[{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},{"type":"null"}],"description":"Only signals detected on or before this day, as YYYY-MM-DD.","title":"Detected Before"},"employee_count":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"The company's employee count."},"industries":{"description":"Only signals from companies in these industries. Up to 25, each matched as a case-insensitive substring of the data source's own industry labels; a value matching none of them is refused upstream.","items":{"type":"string"},"maxItems":25,"title":"Industries","type":"array"},"job_title":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Only people whose job title matches this text.","title":"Job Title"},"revenue":{"anyOf":[{"$ref":"#/components/schemas/RangeFilterSchema"},{"type":"null"}],"description":"Annual revenue in US dollars. The data source filters by named revenue band, so each bound is mapped to the band that contains it."},"seniority":{"description":"Only people at these seniority levels.","items":{"enum":["Staff","Manager","Director","Vp","Cxo"],"type":"string"},"maxItems":5,"title":"Seniority","type":"array"},"signal_subtypes":{"description":"At most one narrower kind within the chosen signal, where it offers any. Optional: a signal with no subtypes sends none.","items":{"type":"string"},"maxItems":1,"title":"Signal Subtypes","type":"array"},"signal_types":{"description":"Which buying signal to look for: exactly one. It is required, and no other filter can anchor a signals search on its own.","items":{"type":"string"},"maxItems":1,"title":"Signal Types","type":"array"},"signals_per_entity":{"anyOf":[{"maximum":100.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"How many of each company's or person's most recent matching signals to attach to its row; 25 when unset. Each company or person is one row however many signals it has, so this changes neither how many rows a search adds nor what they cost, and `signal_count` still gives the total.","title":"Signals Per Entity"}},"title":"SignalPeopleQuerySchema","type":"object"},"SignupSourceClaimReadSchema":{"description":"The outcome of recording a signup source.\n\nAlways 200 for a well formed body. A workspace that already has a source\nkeeps it, and one that is no longer registering gets none: both report\n`recorded: false`, because neither is something to alarm a new user about.","properties":{"recorded":{"description":"Whether this call recorded the source for the workspace.","title":"Recorded","type":"boolean"}},"required":["recorded"],"title":"SignupSourceClaimReadSchema","type":"object"},"SignupSourceClaimRequestSchema":{"description":"The source a new workspace's first link carried, sent once after signup.","properties":{"src":{"anyOf":[{"maxLength":100,"minLength":1,"pattern":"^[a-z0-9-]+$","type":"string"},{"type":"null"}],"description":"The marketing site's own source tag from the register link's `src` parameter, `<lane>-<slug>[-<slot>]`, for example `blog-what-is-data-enrichment-moment`.","title":"Src"},"utm_campaign":{"anyOf":[{"maxLength":100,"minLength":1,"pattern":"^[a-z0-9._-]+$","type":"string"},{"type":"null"}],"description":"The register link's `utm_campaign` parameter, if it had one.","title":"Utm Campaign"},"utm_medium":{"anyOf":[{"maxLength":100,"minLength":1,"pattern":"^[a-z0-9._-]+$","type":"string"},{"type":"null"}],"description":"The register link's `utm_medium` parameter, if it had one.","title":"Utm Medium"},"utm_source":{"anyOf":[{"maxLength":100,"minLength":1,"pattern":"^[a-z0-9._-]+$","type":"string"},{"type":"null"}],"description":"The register link's `utm_source` parameter, if it had one.","title":"Utm Source"}},"title":"SignupSourceClaimRequestSchema","type":"object"},"SlackAuthorizeUrlSchema":{"properties":{"authorize_url":{"title":"Authorize Url","type":"string"}},"required":["authorize_url"],"title":"SlackAuthorizeUrlSchema","type":"object"},"SlackCallbackSchema":{"properties":{"code":{"maxLength":512,"minLength":1,"title":"Code","type":"string"},"state":{"maxLength":256,"minLength":1,"title":"State","type":"string"}},"required":["code","state"],"title":"SlackCallbackSchema","type":"object"},"SlackChannelReadSchema":{"properties":{"id":{"title":"Id","type":"string"},"is_private":{"title":"Is Private","type":"boolean"},"name":{"title":"Name","type":"string"}},"required":["id","name","is_private"],"title":"SlackChannelReadSchema","type":"object"},"SlackConnectionReadSchema":{"properties":{"connected_by_user_id":{"title":"Connected By User Id","type":"string"},"team_id":{"title":"Team Id","type":"string"},"team_name":{"title":"Team Name","type":"string"}},"required":["team_id","team_name","connected_by_user_id"],"title":"SlackConnectionReadSchema","type":"object"},"SourceColumnDefinition":{"description":"Definition of a source column: one imported record, held verbatim.\n\nCarries no configuration of its own. What to import, from where, and how\noften lives on the table's ``table_import_integration`` row, which points back here\nthrough ``object_column_id``; duplicating any of it on the column would\nonly create somewhere for the two to disagree.","properties":{"kind":{"const":"source","default":"source","title":"Kind","type":"string"}},"title":"SourceColumnDefinition","type":"object"},"SourceFieldSchema":{"description":"One field discoverable on an imported record.","properties":{"declared":{"description":"True when the provider lists this field in its own schema. A declared field with no sample value is one every sampled record left empty, still promotable.","title":"Declared","type":"boolean"},"label":{"description":"Humanized name, for a column header.","title":"Label","type":"string"},"path":{"description":"Dotted path into the object; ready for a formula.","title":"Path","type":"string"},"property_type":{"$ref":"#/components/schemas/PropertyType","description":"The type a promoted column would store."},"sample_value":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"An example from the sampled records.","title":"Sample Value"}},"required":["path","label","property_type","declared","sample_value"],"title":"SourceFieldSchema","type":"object"},"SourceIdentityOptionSchema":{"description":"A key an existing table's rows could be matched on, and what switching would do.","properties":{"available":{"description":"Whether the table can switch to it now.","title":"Available","type":"boolean"},"current":{"description":"Whether the rows are matched on it now.","title":"Current","type":"boolean"},"editable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True when people can edit this field in the tool, so an edited record comes back as a new row; false when the tool sets it and it never changes; null when the tool does not say.","title":"Editable"},"field":{"description":"The key, as the tool names it. Send it as identity_field.","title":"Field","type":"string"},"filled":{"description":"How many sampled records carry a value for it.","title":"Filled","type":"integer"},"label":{"description":"The key's name for a person to read, e.g. 'Record ID'.","title":"Label","type":"string"},"problem":{"anyOf":[{"$ref":"#/components/schemas/IdentityFieldProblem"},{"type":"null"}],"description":"Why the table cannot switch to it: `missing` (some records or rows have no value), `shared` (two hold the same one) or `inexact` (the rows store it in a form a refresh cannot match exactly). Null when it can."},"recommended":{"description":"Whether it is the key a new import from this tool would pick.","title":"Recommended","type":"boolean"},"rows":{"description":"Rows in the table that came from the tool.","title":"Rows","type":"integer"},"rows_missing":{"description":"Of those, rows whose stored record has no value for it.","title":"Rows Missing","type":"integer"},"rows_shared":{"description":"Of those, rows whose value another row also has.","title":"Rows Shared","type":"integer"},"sampled":{"description":"How many of the tool's records were just sampled.","title":"Sampled","type":"integer"},"unique":{"description":"Whether no two different sampled records share a value.","title":"Unique","type":"boolean"}},"required":["field","label","current","recommended","sampled","filled","unique","editable","rows","rows_missing","rows_shared","available","problem"],"title":"SourceIdentityOptionSchema","type":"object"},"SpamCheckRequestSchema":{"description":"The drafted text to analyse: pure text in, findings out.","properties":{"body":{"default":"","maxLength":100000,"title":"Body","type":"string"},"opens_thread":{"default":true,"description":"Whether the email starts a thread of its own. A first email is held to a cold email's length, 25 to 200 words; a reply in a thread may be short. Read for an email only.","title":"Opens Thread","type":"boolean"},"scope":{"$ref":"#/components/schemas/SpamCheckScope","default":"email","description":"What the text is. A signature skips the length rules, which only make sense about a whole email."},"subject":{"default":"","maxLength":1000,"title":"Subject","type":"string"}},"title":"SpamCheckRequestSchema","type":"object"},"SpamCheckResponseSchema":{"properties":{"findings":{"items":{"$ref":"#/components/schemas/SpamFindingReadSchema"},"title":"Findings","type":"array"},"passes":{"description":"What an email passes, each with its value: \"2 variables\", \"75 words\", \"No links\", \"1 emoji\". Empty for a signature, and for an email with nothing in it yet.","items":{"type":"string"},"title":"Passes","type":"array"}},"required":["findings"],"title":"SpamCheckResponseSchema","type":"object"},"SpamCheckScope":{"description":"What kind of text the deliverability check is reading.\n\nThe rules are not all portable. Length is the one that isn't: a cold email\nunder eight words really is a filter pattern, and a signature is ALWAYS\nunder eight words (a name and a role is four). Run the email rules over a\nsignature and every sender is told to pad theirs into \"a sentence of\nsubstance\", directly contradicting the guidance printed above the box that\ntells them to keep it to a name, a role, and one link.\n\nEverything else (trigger phrases, link density, shouting, punctuation)\nmeans the same thing wherever the text ends up, and runs for both.","enum":["email","signature"],"title":"SpamCheckScope","type":"string"},"SpamFindingReadSchema":{"properties":{"code":{"title":"Code","type":"string"},"detail":{"description":"The evidence: \"3 in the message. One is safest, two at most.\"","title":"Detail","type":"string"},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt"},"excerpts":{"description":"Every piece of text the finding is about; excerpt is the first.","items":{"type":"string"},"title":"Excerpts","type":"array"},"message":{"description":"Title and detail as one sentence, for a single line.","title":"Message","type":"string"},"severity":{"description":"warning (likely hurts) or info (worth knowing).","title":"Severity","type":"string"},"title":{"description":"The problem, named: \"Too many links\".","title":"Title","type":"string"}},"required":["code","severity","title","detail","message"],"title":"SpamFindingReadSchema","type":"object"},"StartSubdomainSearchRequestSchema":{"description":"Start a search for one domain's subdomains.","properties":{"domain":{"description":"The domain to search, e.g. slack.com. A pasted URL is trimmed.","maxLength":512,"minLength":1,"title":"Domain","type":"string"}},"required":["domain"],"title":"StartSubdomainSearchRequestSchema","type":"object"},"StepAuthoring":{"description":"Who writes an email step's words.\n\nWRITTEN is the default and what every step was before: the author's own\nsubject and body, with variables, snippets and spintax resolved per\ncontact. AGENT holds an instruction instead of a body; the whole email is\nwritten for each contact at send time from that instruction, the row and\nthe workspace's written business context, and priced per contact.","enum":["written","agent"],"title":"StepAuthoring","type":"string"},"StepHold":{"description":"Why a sequence's step may not run now, whatever its approval says.\n\nA paused sequence or a paused contact sends nothing on either channel; an\napproval given meanwhile waits for **Resume sequence** (or the contact's\nown resume).","enum":["sequence_paused","contact_paused"],"title":"StepHold","type":"string"},"StepHoldReadSchema":{"description":"The worst reason holding contacts on one step, for the step's card.","properties":{"contacts":{"title":"Contacts","type":"integer"},"reason":{"$ref":"#/components/schemas/SequenceHold"},"step_id":{"format":"uuid","title":"Step Id","type":"string"}},"required":["step_id","reason","contacts"],"title":"StepHoldReadSchema","type":"object"},"StepPerformanceReadSchema":{"description":"One non-condition step's outcomes. Null = honestly unknowable.","properties":{"bounces":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bounces"},"kind":{"title":"Kind","type":"string"},"name":{"title":"Name","type":"string"},"position":{"title":"Position","type":"integer"},"replies":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replies"},"sent":{"description":"Accepted sends or succeeded LinkedIn actions.","title":"Sent","type":"integer"},"step_id":{"format":"uuid","title":"Step Id","type":"string"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},"required":["step_id","position","kind","name","type","sent","replies","bounces"],"title":"StepPerformanceReadSchema","type":"object"},"StepRef":{"description":"A parameter that reads an EARLIER step's output in the same chain.\n\nWithout this a chain could fork but never join. ``source_step`` already let\na unary step read back to an earlier result, but the only functions that\ntake several inputs at once (``concatenate`` and ``format``) could name\ncolumns and literals and nothing else. So \"upper-case the initial of one\ncolumn, do the same to another, then put the two together\" had no\nexpression: the two halves could be computed but never combined, and the\nauthor had to invert the whole formula into combine-first-then-extract.\n\nReading a step that is not strictly earlier has no value to read, so\n``chain_refs.validate_step_references`` rejects it at save time rather than\nletting the engine quietly substitute something else.","properties":{"ref":{"const":"step","default":"step","title":"Ref","type":"string"},"step":{"description":"1-based position of the step to read.","minimum":1.0,"title":"Step","type":"integer"}},"required":["step"],"title":"StepRef","type":"object"},"StepSkipReason":{"description":"Why the engine passed a step without doing it, for a contact that step cannot reach.\n\nKept on the skip ledger at the moment of the skip, because nothing else\nremembers it: the engine moves the contact on, and the status cell the\nskip wrote is rewritten by the next step's line. The first two are an\nemail step's reasons, the rest a LinkedIn step's. A step the browser\nskipped is not here: its LinkedIn action keeps that ending itself.","enum":["no_email","email_verdict","no_linkedin_url","own_profile","profile_not_resolved","nothing_to_withdraw"],"title":"StepSkipReason","type":"string"},"StopReason":{"enum":["reply","unsubscribe","bounce","manual","company_reply","row_left_audience","row_left_paused","step_removed","removed","cooldown","rejected","mailbox_removed","trashed","trashed_paused"],"title":"StopReason","type":"string"},"SubdomainSearchResponseSchema":{"description":"One search and whatever it has found so far.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"domain":{"title":"Domain","type":"string"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"hostnames":{"description":"Discovered hostnames, newest first sighting first. Empty until the search succeeds. At most the per-search cap (5,000 by default): a larger domain is trimmed to its newest names and partial is true.","items":{"type":"string"},"title":"Hostnames","type":"array"},"hostnames_found":{"description":"How many distinct hostnames the search found, before the per-search cap. Larger than len(hostnames) when the cap trimmed the list; use this for the headline count.","title":"Hostnames Found","type":"integer"},"id":{"format":"uuid","title":"Id","type":"string"},"partial":{"description":"True when hostnames is a slice of what was found, which is when hostnames_found exceeds len(hostnames). The names kept are the newest first sightings.","title":"Partial","type":"boolean"},"retryable":{"description":"Whether running the same search again could plausibly work.","title":"Retryable","type":"boolean"},"rows_created":{"title":"Rows Created","type":"integer"},"rows_to_add":{"description":"How many rows turning this search into a table would add: the hostnames stored, cut to the plan's rows per table. Put it on the create button; 0 until the search succeeds.","title":"Rows To Add","type":"integer"},"status":{"$ref":"#/components/schemas/SubdomainSearchStatus"},"table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Table Id"}},"required":["id","domain","status","hostnames","hostnames_found","partial","rows_to_add","table_id","rows_created","error","error_code","retryable","created_at"],"title":"SubdomainSearchResponseSchema","type":"object"},"SubdomainSearchStatus":{"description":"Where one subdomain search has got to.","enum":["pending","running","succeeded","failed"],"title":"SubdomainSearchStatus","type":"string"},"SubscriptionRead":{"description":"Response schema for subscription information.","properties":{"billing_email":{"anyOf":[{"format":"email","type":"string"},{"type":"null"}],"description":"The billing email address for invoices and billing alerts. ","title":"Billing Email"},"billing_interval":{"anyOf":[{"enum":["month","year"],"type":"string"},{"type":"null"}],"description":"The billing interval of the subscription. None for free plans.","title":"Billing Interval"},"cancel_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The date when the subscription is scheduled to be canceled. If set, the subscription will be canceled at this time. None if the subscription is not scheduled for cancellation.","title":"Cancel At"},"credit_quantity":{"description":"The monthly credit allowance the subscription's own price grants.","title":"Credit Quantity","type":"integer"},"credit_tier_key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The selected credit volume (e.g. 'team_tier_20k'). None for free plans.","title":"Credit Tier Key"},"current_period_end":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The end of the current Stripe billing period. None for free plans: credit period truth lives on the credit balance.","title":"Current Period End"},"current_period_start":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The start of the current Stripe billing period. None for free plans: credit period truth lives on the credit balance.","title":"Current Period Start"},"current_price_decimal":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What the subscription actually costs per `billing_interval` unit, in cents, read off its own Stripe price. None for free plans. Prefer this over recomputing from the catalog: it stays right for a grandfathered price or a volume the catalog has since retired.","title":"Current Price Decimal"},"data_retention":{"description":"Data retention period.","format":"duration","title":"Data Retention","type":"string"},"included_credits":{"description":"Credits granted each period (the period allowance).","title":"Included Credits","type":"integer"},"is_product_limited":{"description":"Whether the product is currently limited due to usage or payment issues. \nWhen True, the organization cannot perform billable actions. \nThis happens in two scenarios: \n1. The credit balance is exhausted. \n2. The subscription status is UNPAID (payment failed or cancelled). \n","title":"Is Product Limited","type":"boolean"},"max_integrations":{"description":"Maximum number of integrations allowed. 0 means unlimited.","title":"Max Integrations","type":"integer"},"max_rows_per_table":{"description":"Maximum number of rows per table. 0 means unlimited.","title":"Max Rows Per Table","type":"integer"},"max_tables":{"description":"Maximum number of tables allowed. 0 means unlimited.","title":"Max Tables","type":"integer"},"payment_method":{"anyOf":[{"$ref":"#/components/schemas/PaymentMethodReadSchema"},{"type":"null"}],"description":"The default payment card summary. None when no card is on file."},"product_name":{"description":"The product name for the subscription.","title":"Product Name","type":"string"},"product_type":{"$ref":"#/components/schemas/ProductTier","description":"The product name for the subscription."},"seats":{"description":"Number of seats included. 0 means unlimited.","title":"Seats","type":"integer"},"status":{"$ref":"#/components/schemas/SubscriptionStatus","description":"The subscription status. \n- active: User has active product with no past due fees. \n  - Product remains active with full functionality. \n- incomplete_payment: The first payment failed or is processing. \n  - Product remains active with full functionality. \n  - User action is required to activate. Otherwise the product will become UNPAID. \n- past_due: The subscription fees aren't paid. Stripe will retry to collect the payment. \n  - Product remains active with full functionality. \n  - No user action is needed yet. However a user can proactively solve the issue. \n- unpaid: The subscription fees aren't paid. Stripe will no longer try to collect the payment. \n  - Product is not functional anymore. \n  - Needs user action to activate. \n"}},"required":["product_name","product_type","status","current_period_start","current_period_end","billing_interval","credit_tier_key","current_price_decimal","credit_quantity","payment_method","billing_email","is_product_limited","max_integrations","included_credits","max_tables","max_rows_per_table","data_retention","seats"],"title":"SubscriptionRead","type":"object"},"SubscriptionStatus":{"description":"The status of a subscription for an organization.\n\nActive is the good state for all types of products. All other states are transitional states.\n\nWhen a subscription is cancelled, it becomes Free plan. We treat cancelled Stripe subscriptions\nas non-existent. Customer won't see any cancelled subscriptions on billing portal.\n\nThere is a long transition from:\nActive -> Past Due -> Unpaid -> Free","enum":["active","incomplete_payment","past_due","unpaid"],"title":"SubscriptionStatus","type":"string"},"SuccessfullyDeletedResponse":{"properties":{"count":{"default":1,"description":"The number of resources that were deleted.","title":"Count","type":"integer"},"detail":{"description":"The detail of why the resource was deleted.","title":"Detail","type":"string"}},"required":["detail"],"title":"SuccessfullyDeletedResponse","type":"object"},"SuggestedIntegrationName":{"description":"Response model for Suggest Integration Name endpoint.","properties":{"suggested_name":{"description":"The suggested unique integration name.","title":"Suggested Name","type":"string"}},"required":["suggested_name"],"title":"SuggestedIntegrationName","type":"object"},"SuggestedLeadTableNameSchema":{"description":"The name a table would take from the search that fills it.","properties":{"suggested_name":{"description":"The search's most telling filters, joined with commas, or what its rows are and today's date when it has none.","title":"Suggested Name","type":"string"}},"required":["suggested_name"],"title":"SuggestedLeadTableNameSchema","type":"object"},"SuppressionAddResultSchema":{"properties":{"added":{"description":"How many entries were new.","title":"Added","type":"integer"},"rejected":{"description":"Inputs that could not be parsed.","items":{"type":"string"},"title":"Rejected","type":"array"}},"required":["added","rejected"],"title":"SuppressionAddResultSchema","type":"object"},"SuppressionAddSchema":{"properties":{"values":{"description":"Addresses and domains, one per item. A value containing @ suppresses one address; a bare domain suppresses everyone at it.","items":{"maxLength":320,"minLength":1,"type":"string"},"maxItems":10000,"minItems":1,"title":"Values","type":"array"}},"required":["values"],"title":"SuppressionAddSchema","type":"object"},"SuppressionDeleteResultSchema":{"properties":{"deleted":{"title":"Deleted","type":"integer"}},"required":["deleted"],"title":"SuppressionDeleteResultSchema","type":"object"},"SuppressionDeleteSchema":{"properties":{"entry_ids":{"items":{"format":"uuid","type":"string"},"minItems":1,"title":"Entry Ids","type":"array"}},"required":["entry_ids"],"title":"SuppressionDeleteSchema","type":"object"},"SuppressionEntryReadSchema":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"$ref":"#/components/schemas/SuppressionKind"},"source":{"$ref":"#/components/schemas/SuppressionSource"},"value":{"title":"Value","type":"string"}},"required":["id","kind","value","source","created_at"],"title":"SuppressionEntryReadSchema","type":"object"},"SuppressionKind":{"description":"Whether an entry blocks one address or a whole domain.","enum":["email","domain"],"title":"SuppressionKind","type":"string"},"SuppressionPageSchema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SuppressionEntryReadSchema"},"title":"Items","type":"array"},"total":{"title":"Total","type":"integer"}},"required":["items","total"],"title":"SuppressionPageSchema","type":"object"},"SuppressionSource":{"description":"How an entry got onto the list, kept for audit and for the UI's story.","enum":["manual","opt_out_reply","inbox_action","opt_out_link","hard_bounce"],"title":"SuppressionSource","type":"string"},"SwitchIntent":{"description":"Why an OAuth grant is being captured against an *existing* integration.\n\nSet on an installation whose grant re-authorizes a connection in place rather than creating a\nnew one. ``None`` on a normal new-connect install.","enum":["switch","reconnect"],"title":"SwitchIntent","type":"string"},"SwitchPlanRedirectResponse":{"description":"Where to send the customer to complete the plan change.\n\nThere is no \"completed\" case: Stripe confirms every plan change, so this\nalways carries a URL to leave for.","properties":{"redirect_url":{"description":"The URL to redirect the customer to.","format":"uri","maxLength":2083,"minLength":1,"title":"Redirect Url","type":"string"},"type":{"description":"Which Stripe surface completes the change: 'checkout' for a first paid subscription, 'portal' for a change to an existing one.","enum":["checkout","portal"],"title":"Type","type":"string"}},"required":["type","redirect_url"],"title":"SwitchPlanRedirectResponse","type":"object"},"SwitchPlanRequest":{"description":"Request schema for switching subscription plan.","properties":{"billing_interval":{"default":"month","description":"The billing interval to subscribe with.","enum":["month","year"],"title":"Billing Interval","type":"string"},"cancel_path":{"description":"Partial path (e.g. /billing/plans) of where the stripe Checkout session should redirect the user if payment is cancelled.","maxLength":255,"minLength":1,"title":"Cancel Path","type":"string"},"credit_tier_key":{"anyOf":[{"maxLength":50,"minLength":1,"type":"string"},{"type":"null"}],"description":"The credit tier to subscribe to (e.g. 'tier_20k'). Required for products with selectable credit tiers (the Team plan).","title":"Credit Tier Key"},"new_product":{"$ref":"#/components/schemas/ProductTier","description":"The new product to switch to."},"success_path":{"description":"Partial path (e.g. /billing/complete) of where the stripe Checkout session should redirect the user if payment is successful.","maxLength":255,"minLength":1,"title":"Success Path","type":"string"}},"required":["success_path","cancel_path","new_product"],"title":"SwitchPlanRequest","type":"object"},"SyncSequenceResponseSchema":{"description":"The manual \"Sync now\" result: what just happened, and when it happened.","properties":{"enrolled":{"description":"Contacts newly enrolled by this sync run.","title":"Enrolled","type":"integer"},"last_synced_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the diff completed. None if the sequence has no audience yet.","title":"Last Synced At"}},"required":["enrolled","last_synced_at"],"title":"SyncSequenceResponseSchema","type":"object"},"TableArchiveSchema":{"description":"Request body for archiving tables, or bringing them back.","properties":{"archived":{"description":"True archives them: they leave All, their folder and Favorites and Recent, stay in search, and keep every row. False brings them back to the list, into their folder.","title":"Archived","type":"boolean"},"table_ids":{"description":"The tables.","items":{"format":"uuid","type":"string"},"maxItems":500,"minItems":1,"title":"Table Ids","type":"array"}},"required":["table_ids","archived"],"title":"TableArchiveSchema","type":"object"},"TableArithmetic-Input":{"description":"Apply an arithmetic operator with a constant or column-valued operand.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"arithmetic","default":"arithmetic","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"operand":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Operand"},"operator":{"enum":["add","subtract","multiply","divide"],"title":"Operator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["operator","operand"],"title":"TableArithmetic","type":"object"},"TableArithmetic-Output":{"description":"Apply an arithmetic operator with a constant or column-valued operand.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"arithmetic","default":"arithmetic","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"operand":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Operand"},"operator":{"enum":["add","subtract","multiply","divide"],"title":"Operator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["operator","operand"],"title":"TableArithmetic","type":"object"},"TableCellActivityEventSchema":{"description":"One live agent step for one cell of an active run.\n\nPublished IMMEDIATELY, bypassing the post-commit queue, because steps are\ntelemetry about work that already happened, not table state, and a\ncompute page's transaction spans the whole page. Never coalesced:\nliveness is the point. The transport is lossy by design, so clients treat\nthe post-commit ``rows_changed`` settle as authoritative and use these\nframes for display only.","properties":{"attempt":{"default":1,"description":"1-based retry attempt; an increment means the investigation restarted, so clear the displayed trail.","title":"Attempt","type":"integer"},"column_id":{"format":"uuid","title":"Column Id","type":"string"},"kind":{"const":"cell_activity","default":"cell_activity","title":"Kind","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"run_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Run Id"},"seq":{"description":"0-based and strictly rising across the whole cell execution, retries included. The ordering key.","title":"Seq","type":"integer"},"step":{"$ref":"#/components/schemas/TableCellActivityStepSchema"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","record_id","column_id","seq","step"],"title":"TableCellActivityEventSchema","type":"object"},"TableCellActivityStepSchema":{"description":"One agent research step, JSON-native.\n\nPlain strings rather than the agent domain's enums: this package sits\nbelow ``table_agent`` and cannot import it, exactly like\n``TableRunRowScopeSchema.kind``. ``action`` values today are ``search`` |\n``map`` | ``scrape`` | ``crawl`` | ``mcp_tool`` | ``finish``; ``outcome``\nvalues are ``completed`` | ``failed`` | ``refused`` | ``stopped``, the\nsame set ``core.ai.AiStep`` spells. Clients must tolerate new tokens.","properties":{"action":{"title":"Action","type":"string"},"detail":{"description":"The search query, target URL, or tool call: the step's input.","title":"Detail","type":"string"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"observation":{"description":"One line on what came back.","title":"Observation","type":"string"},"outcome":{"default":"completed","title":"Outcome","type":"string"},"thought":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The model's stated reasoning for choosing this step.","title":"Thought"}},"required":["action","detail","observation"],"title":"TableCellActivityStepSchema","type":"object"},"TableCellBulkEditItemSchema":{"description":"One edit in a bulk cell write; a null value clears the cell.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"value":{"anyOf":[{"$ref":"#/components/schemas/CellValue-Input"},{"type":"null"}],"description":"The new cell value, or null to clear it so the column default renders. A Decimal or Currency value is rounded to the column's decimal places, half away from zero."}},"required":["record_id","column_id"],"title":"TableCellBulkEditItemSchema","type":"object"},"TableCellClearRequestSchema":{"description":"Request body for clearing one manual cell (the column's default renders again).","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"}},"required":["record_id","column_id"],"title":"TableCellClearRequestSchema","type":"object"},"TableCellDeltaSchema":{"description":"One cell's post-write state.\n\nDeliberately carries NO ``computing`` flag. That flag is derived\n(``stale`` AND the table has an active run) and a write has no idea whether\na run is active, so carrying it here would flicker cells out of their\ncomputing state mid-run. Clients derive it from their own active-run state,\nexactly as the REST responses do.","properties":{"computed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Last compute time, for formula cells.","title":"Computed At"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The agent's own read on its answer, when the action reports one.","title":"Confidence"},"credits_charged":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Credits the last successful enrichment charged for this cell.","title":"Credits Charged"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Evaluation error, when the cell is in an error state.","title":"Error"},"error_class":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The failure's taxonomy class, when the cell is errored.","title":"Error Class"},"manual_override":{"default":false,"description":"A hand-entered correction runs will not overwrite.","title":"Manual Override","type":"boolean"},"settled_as":{"default":"pending","description":"How the last attempt on this cell ENDED, never what it shows. The grid needs it to tell `no_data` (ran, found nothing) from `pending` (never ran): both render blank and neither carries an error.","enum":["succeeded","no_data","skipped","failed","pending"],"title":"Settled As","type":"string"},"skipped_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why an enrichment run skipped this cell, when it did.","title":"Skipped Reason"},"stale":{"default":false,"description":"Whether the value is out of date and awaits a recompute.","title":"Stale","type":"boolean"},"updated_at":{"description":"When this cell was last written.","format":"date-time","title":"Updated At","type":"string"},"value":{"description":"The cell's value; null renders the column default.","title":"Value"},"version":{"description":"Per-cell watermark; apply only if at least the cached one.","title":"Version","type":"integer"}},"required":["value","error","version","updated_at"],"title":"TableCellDeltaSchema","type":"object"},"TableCellEditRequestSchema":{"description":"Request body for editing one manual cell.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"value":{"$ref":"#/components/schemas/CellValue-Input","description":"The new cell value; coerced to the column's data type. A Decimal or Currency value is rounded to the column's decimal places, half away from zero: 2.005 at 2 places is stored as 2.01."}},"required":["record_id","column_id","value"],"title":"TableCellEditRequestSchema","type":"object"},"TableCellMutationResponseSchema":{"description":"Read-your-writes result of a cell mutation. Never carries a run ID.\n\nWhen ``recomputed_column_ids`` is non-empty the downstream formula values\nare already final in ``cells``; otherwise the recompute run appears on the\nnext active-runs poll. ``stale_column_ids`` is empty on a same-value edit,\nwhich writes nothing. Each returned cell carries its own version, which is\nwhat the client gates its cache on.","properties":{"cells":{"additionalProperties":{"$ref":"#/components/schemas/TableCellSchema"},"title":"Cells","type":"object"},"column_id":{"format":"uuid","title":"Column Id","type":"string"},"recomputed_column_ids":{"description":"Formula columns recomputed INLINE within this request. Their values in `cells` are final and no background run was requested. Empty when a run was queued instead, in which case those cells arrive later.","items":{"format":"uuid","type":"string"},"title":"Recomputed Column Ids","type":"array"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"stale_column_ids":{"description":"Transitive formula dependents now marked stale; empty on a same-value edit.","items":{"format":"uuid","type":"string"},"title":"Stale Column Ids","type":"array"}},"required":["record_id","column_id","cells","stale_column_ids"],"title":"TableCellMutationResponseSchema","type":"object"},"TableCellSchema":{"description":"One cell of a table row; a column absent from the row's cell map renders blank.\n\n``computing`` is DERIVED, never stored: a cell is computing iff it is stale\nAND some active run has this row in its resolved scope. That second half\nused to reduce to \"any active run exists anywhere in the table\", because a\nrun row published nothing about which rows it would touch; it now consults\nthe scope the mint resolved, so a run over ten rows marks ten rows\ncomputing rather than every stale cell in the table.\n\n``version`` is the cell's own monotonic watermark. It replaced a row-level\ncounter, so two people editing different cells of one row no longer\ninvalidate each other's cached view.","properties":{"cancelled":{"default":false,"description":"A run that owed this cell a recompute was cancelled or paused before reaching it. Cleared by any subsequent write; distinct from never-run (which has no cell at all).","title":"Cancelled","type":"boolean"},"computed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Last compute time (formula cells).","title":"Computed At"},"computing":{"default":false,"description":"Stale AND an active run has this row in its scope.","title":"Computing","type":"boolean"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The agent's own read on its answer (high/medium/low); null for actions that report none. What the grid's confidence glyph draws.","title":"Confidence"},"credits_charged":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Credits charged for producing this value; null for free work (manual edits, formulas, cache hits).","title":"Credits Charged"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cell's evaluation error, when it failed.","title":"Error"},"error_class":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Machine-readable class of a failed enrichment cell (timeout, rate_limited, schema_violation, ...); null for formula errors and everything that is not an error.","title":"Error Class"},"manual_override":{"default":false,"description":"A hand-entered correction on an enrichment cell. Runs pass over it unless they explicitly target the cell; the grid marks it.","title":"Manual Override","type":"boolean"},"settled_as":{"$ref":"#/components/schemas/TableCellSettlement","default":"pending","description":"How the last attempt on this cell ENDED, never what it shows.\n\nThe grid needs it to tell `no_data` (ran, found nothing) from `pending` (never ran). Both render blank, and on a formula column neither carries an error to tell them apart, so without this a finished cell was indistinguishable from an untouched one."},"skipped_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Non-null means the last run deliberately held this cell back: a required input was empty, or the run condition was false. A third outcome distinct from value and error; nothing ran, nothing was charged.","title":"Skipped Reason"},"stale":{"default":false,"description":"Value out of date; a recompute is pending.","title":"Stale","type":"boolean"},"updated_at":{"description":"When this cell was last written.","format":"date-time","title":"Updated At","type":"string"},"value":{"description":"The cell value; numbers are surfaced as JSON numbers.","title":"Value"},"version":{"description":"Per-cell watermark; apply a delta only if at least this.","title":"Version","type":"integer"}},"required":["value","error","version","updated_at"],"title":"TableCellSchema","type":"object"},"TableCellSettlement":{"description":"How this cell's last attempt ENDED. Never what the cell shows.\n\nAnswers \"is any work owed here\", and nothing else. What a cell DISPLAYS is\nstill read from the typed value slots, and must stay that way: sorting,\nfiltering and ``HAS_RESULTS`` all ask what the cell contains. Only\ncompleteness asks this.\n\nTHE FACT THAT WAS MISSING. The table stored what a cell contains and had no\ncolumn for whether work was still owed on it, so every completeness figure\nguessed the second from the first. The guess was wrong in both directions.\nA cell that ran cleanly and produced nothing is DONE, and it read as\npermanently incomplete. On an AI column that is the majority outcome, so a\ntable whose every run had finished could never reach 100%. Meanwhile a\nprovider's ``200 OK`` carrying ``{\"email\": None}`` read as filled.\n\nDeliberately ORTHOGONAL to ``stale``. A stale cell keeps the settlement of\nthe attempt that produced the value it is still showing; freshness is the\n``stale`` flag's job, and duplicating it here would give one fact two homes\nthat could disagree. \"Complete\" is therefore a conjunction of the two, and\nthe aggregate spells it out rather than hiding it in a member.\n\nMembers mirror the run counters on ``table_run`` (``cells_done`` /\n``_failed`` / ``_skipped`` / ``_no_data``) one for one, so the footer\nmid-run and the footer idle finally measure comparable things.","enum":["succeeded","no_data","skipped","failed","pending"],"title":"TableCellSettlement","type":"string"},"TableCellsBulkEditRequestSchema":{"description":"Request body for the bulk cell write: all-or-nothing, one recompute run.","properties":{"edits":{"description":"The cell edits to apply.","items":{"$ref":"#/components/schemas/TableCellBulkEditItemSchema"},"maxItems":1000,"minItems":1,"title":"Edits","type":"array"},"restore":{"default":false,"description":"History only: set by the grid's undo and redo, which put back exactly what a cell held before. A Select or Multi-select value the column's options no longer name is then written back as it was, and no option is added; a number goes back with every digit it had, unrounded. Every other writer, AI agents and integrations included, leaves it false: a new value must be one of the column's options, and a number is rounded to the column's places.","title":"Restore","type":"boolean"}},"required":["edits"],"title":"TableCellsBulkEditRequestSchema","type":"object"},"TableCellsBulkMutationResponseSchema":{"description":"Read-your-writes result of a bulk cell write. Never carries a run ID.\n\n``rows`` covers every row named by the request, including ones whose edits\nwere all same-value no-ops, so the client can reconcile its whole\nselection in one pass.","properties":{"applied":{"description":"Edits that changed a value and were written.","title":"Applied","type":"integer"},"recomputed_column_ids":{"description":"Formula columns recomputed INLINE within this request. Their values in `rows` are final and no background run was requested. Empty when a run was queued instead.","items":{"format":"uuid","type":"string"},"title":"Recomputed Column Ids","type":"array"},"rows":{"items":{"$ref":"#/components/schemas/TableRowSchema"},"title":"Rows","type":"array"},"skipped":{"description":"Same-value edits that wrote nothing.","title":"Skipped","type":"integer"},"stale_column_ids":{"description":"Transitive formula dependents now marked stale across all edited rows.","items":{"format":"uuid","type":"string"},"title":"Stale Column Ids","type":"array"}},"required":["rows","stale_column_ids","applied","skipped"],"title":"TableCellsBulkMutationResponseSchema","type":"object"},"TableChangeCase-Input":{"description":"Change the case of a string value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"change_case","default":"change_case","title":"Function","type":"string"},"mode":{"enum":["lower","upper","title"],"title":"Mode","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["mode"],"title":"TableChangeCase","type":"object"},"TableChangeCase-Output":{"description":"Change the case of a string value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"change_case","default":"change_case","title":"Function","type":"string"},"mode":{"enum":["lower","upper","title"],"title":"Mode","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["mode"],"title":"TableChangeCase","type":"object"},"TableChangeEventSchema":{"description":"One frame of the change feed, discriminated by ``kind``.\n\nA wrapper model rather than a bare union so the whole vocabulary lands in\nthe OpenAPI document as a single named schema the client can switch on.","properties":{"event":{"description":"The event body; switch on `kind`.","discriminator":{"mapping":{"cell_activity":"#/components/schemas/TableCellActivityEventSchema","columns_changed":"#/components/schemas/TableColumnsChangedEventSchema","hello":"#/components/schemas/TableHelloEventSchema","reconnect":"#/components/schemas/TableReconnectEventSchema","resync":"#/components/schemas/TableResyncEventSchema","rows_changed":"#/components/schemas/TableRowsChangedEventSchema","rows_invalidated":"#/components/schemas/TableRowsInvalidatedEventSchema","run_changed":"#/components/schemas/TableRunChangedEventSchema","table_changed":"#/components/schemas/TableChangedEventSchema","table_deleted":"#/components/schemas/TableDeletedEventSchema","ui_prefs_changed":"#/components/schemas/TableUIPrefsChangedEventSchema"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/TableHelloEventSchema"},{"$ref":"#/components/schemas/TableRowsChangedEventSchema"},{"$ref":"#/components/schemas/TableRowsInvalidatedEventSchema"},{"$ref":"#/components/schemas/TableColumnsChangedEventSchema"},{"$ref":"#/components/schemas/TableUIPrefsChangedEventSchema"},{"$ref":"#/components/schemas/TableChangedEventSchema"},{"$ref":"#/components/schemas/TableDeletedEventSchema"},{"$ref":"#/components/schemas/TableRunChangedEventSchema"},{"$ref":"#/components/schemas/TableCellActivityEventSchema"},{"$ref":"#/components/schemas/TableResyncEventSchema"},{"$ref":"#/components/schemas/TableReconnectEventSchema"}],"title":"Event"}},"required":["event"],"title":"TableChangeEventSchema","type":"object"},"TableChangedEventSchema":{"description":"The table definition changed (name, description, or row counter).","properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"kind":{"const":"table_changed","default":"table_changed","title":"Kind","type":"string"},"name":{"title":"Name","type":"string"},"row_count":{"title":"Row Count","type":"integer"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["table_id","name","description","row_count","updated_at"],"title":"TableChangedEventSchema","type":"object"},"TableClamp-Input":{"description":"Clamp a numeric value to an inclusive range.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"clamp","default":"clamp","title":"Function","type":"string"},"max_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Max Value"},"min_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Min Value"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableClamp","type":"object"},"TableClamp-Output":{"description":"Clamp a numeric value to an inclusive range.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"clamp","default":"clamp","title":"Function","type":"string"},"max_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Max Value"},"min_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Min Value"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableClamp","type":"object"},"TableCoalesce-Input":{"description":"Substitute a default (a literal or another column) when the input is empty.","properties":{"default_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Default Value"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"coalesce","default":"coalesce","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["default_value"],"title":"TableCoalesce","type":"object"},"TableCoalesce-Output":{"description":"Substitute a default (a literal or another column) when the input is empty.","properties":{"default_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Default Value"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"coalesce","default":"coalesce","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["default_value"],"title":"TableCoalesce","type":"object"},"TableColumnColorLabelsReadSchema":{"description":"What this organisation calls each column tint.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Colour token to this organisation's name for it. SPARSE: a token that is absent has not been renamed, and the client shows its built-in name.","propertyNames":{"$ref":"#/components/schemas/TableColumnUIColor"},"title":"Labels","type":"object"}},"required":["labels"],"title":"TableColumnColorLabelsReadSchema","type":"object"},"TableColumnColorLabelsUpdateSchema":{"description":"Request body replacing the organisation's colour names.","properties":{"labels":{"additionalProperties":{"maxLength":40,"type":"string"},"description":"The complete set of names. A REPLACE, not a merge: a token omitted here, or given a blank name, goes back to its built-in name.","propertyNames":{"$ref":"#/components/schemas/TableColumnUIColor"},"title":"Labels","type":"object"}},"required":["labels"],"title":"TableColumnColorLabelsUpdateSchema","type":"object"},"TableColumnCreateSchema":{"description":"Request body for creating a table column.","properties":{"auto_run":{"default":true,"description":"Whether data changes (cell edits, new rows) recompute this column by themselves. Off, its cells go visibly stale and wait for an explicit run. Explicit runs and definition edits ignore it. IGNORED for export columns, which are always created with auto-run off. An export writes into a connected destination, so it may only be set to run by itself in a later, deliberate update.","title":"Auto Run","type":"boolean"},"column_type":{"anyOf":[{"$ref":"#/components/schemas/TableColumnType"},{"type":"null"}],"description":"The semantic column type. Required for manual columns; for formula columns it defaults to the plain type for the chain's derived output and must otherwise be able to store it."},"data_type":{"anyOf":[{"$ref":"#/components/schemas/PropertyType"},{"type":"null"}],"description":"DEPRECATED: send `column_type` instead. Accepted for one release so a client from before semantic types keeps working; it is read as the plain column type for that storage type, and is ignored when `column_type` is set."},"definition":{"$ref":"#/components/schemas/TableColumnDefinition-Input","description":"The column definition (a discriminated union: the kind lives inside it)."},"description":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{"type":"null"}],"description":"Optional note on what the column holds and where it comes from.","title":"Description"},"display_name":{"description":"Column display name, unique per table.","maxLength":255,"minLength":1,"title":"Display Name","type":"string"},"expand_output_fields":{"default":true,"description":"For a multi-field enrichment, also create one child column per declared scalar output field, reading that field out of this column's payload. The payload column itself stays as the record of what came back; the children are what a person sorts, filters and exports on. Ignored for every other kind of column, and for a single-field output. There the parent column already IS the field. Set false to create the payload column alone.","title":"Expand Output Fields","type":"boolean"},"output_column_names":{"additionalProperties":{"maxLength":255,"minLength":1,"type":"string"},"description":"What to CALL each fanned-out child column, keyed by output field name. The author names them while setting the column up, so the preview they were shown is what the table gets. A field with no entry keeps the derived name, and a name already taken on the table falls back to the derived one rather than losing the column. Ignored when expand_output_fields is false, and CREATE only. An edit never renames a column that already exists.","maxProperties":50,"propertyNames":{"maxLength":100,"minLength":1},"title":"Output Column Names","type":"object"},"position":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"Insert position; appended when omitted.","title":"Position"},"refresh_interval_hours":{"default":0,"description":"How often to re-run this column on its own, in hours. 0 is off. Capped at 8760 (a year), which is the point past which a schedule stops being one.","maximum":8760.0,"minimum":0.0,"title":"Refresh Interval Hours","type":"integer"},"run_condition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Input"},{"type":"null"}],"description":"A formula whose result gates this column per row: the cell runs only where it evaluates truthy, and rows where it does not are left as they are rather than cleared. Null runs every row. A gate that fails to evaluate does NOT hold a row back: an unknown answer runs."},"run_condition_view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A saved view whose filter this column follows as its run condition. When set, the engine evaluates membership in the view's current filter at run time, so the gate updates automatically when the view's filter changes. Editing the run condition directly detaches from the view. Mutually exclusive with an explicit run_condition. Set one or the other, not both.","title":"Run Condition View Id"},"run_delay_seconds":{"default":0,"description":"Seconds to wait after the run's conditions are met before this column runs. 0 runs immediately. Capped at 600 (10 minutes). A longer wait is a schedule, not a delay.","maximum":600.0,"minimum":0.0,"title":"Run Delay Seconds","type":"integer"},"suppress_run":{"default":false,"description":"Create the column without computing it. Its cells are left empty and `pending_recompute` is set, so the column reads as waiting for a run rather than as one that ran and found nothing. For a formula over a large table, where the author wants the shape saved now and the cost paid when they say so.","title":"Suppress Run","type":"boolean"},"type_options":{"anyOf":[{"$ref":"#/components/schemas/TableColumnTypeOptions-Input"},{"type":"null"}],"description":"Per-type options; omit for the type's defaults."}},"required":["definition","display_name"],"title":"TableColumnCreateSchema","type":"object"},"TableColumnCreditRatesResponseSchema":{"description":"Every paid column's per-row price on a table.","properties":{"columns":{"items":{"$ref":"#/components/schemas/ColumnCreditRateSchema"},"title":"Columns","type":"array"}},"required":["columns"],"title":"TableColumnCreditRatesResponseSchema","type":"object"},"TableColumnDefinition-Input":{"description":"Discriminated union of column definitions.\n\nA ``RootModel`` is required because ``PydanticJSON`` needs a ``BaseModel``\nsubclass to (de)serialize the stored JSON. Consumers always access the\nconcrete member via ``.root``.","discriminator":{"mapping":{"enrichment":"#/components/schemas/EnrichmentColumnDefinition-Input","export":"#/components/schemas/ExportColumnDefinition-Input","formula":"#/components/schemas/FormulaColumnDefinition-Input","manual":"#/components/schemas/ManualColumnDefinition","sequence":"#/components/schemas/SequenceColumnDefinition","source":"#/components/schemas/SourceColumnDefinition"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/ManualColumnDefinition"},{"$ref":"#/components/schemas/FormulaColumnDefinition-Input"},{"$ref":"#/components/schemas/EnrichmentColumnDefinition-Input"},{"$ref":"#/components/schemas/SourceColumnDefinition"},{"$ref":"#/components/schemas/ExportColumnDefinition-Input"},{"$ref":"#/components/schemas/SequenceColumnDefinition"}],"title":"TableColumnDefinition"},"TableColumnDefinition-Output":{"description":"Discriminated union of column definitions.\n\nA ``RootModel`` is required because ``PydanticJSON`` needs a ``BaseModel``\nsubclass to (de)serialize the stored JSON. Consumers always access the\nconcrete member via ``.root``.","discriminator":{"mapping":{"enrichment":"#/components/schemas/EnrichmentColumnDefinition-Output","export":"#/components/schemas/ExportColumnDefinition-Output","formula":"#/components/schemas/FormulaColumnDefinition-Output","manual":"#/components/schemas/ManualColumnDefinition","sequence":"#/components/schemas/SequenceColumnDefinition","source":"#/components/schemas/SourceColumnDefinition"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/ManualColumnDefinition"},{"$ref":"#/components/schemas/FormulaColumnDefinition-Output"},{"$ref":"#/components/schemas/EnrichmentColumnDefinition-Output"},{"$ref":"#/components/schemas/SourceColumnDefinition"},{"$ref":"#/components/schemas/ExportColumnDefinition-Output"},{"$ref":"#/components/schemas/SequenceColumnDefinition"}],"title":"TableColumnDefinition"},"TableColumnDuplicatesResponseSchema":{"description":"A preview of what deduplicating one column would delete.\n\n``record_ids`` are the rows that would GO, ordered as the grid shows them,\nwhich is also the order the keeper rule reads: the first row holding each\nrepeated value survives. The caller deletes them through the ordinary bulk\ndelete, so dedupe inherits its cap and its undo window rather than\nintroducing a second way to remove rows.","properties":{"duplicate_row_count":{"description":"Rows beyond the first for each repeated value: the full count.","title":"Duplicate Row Count","type":"integer"},"groups_count":{"description":"Distinct values that occur in more than one row.","title":"Groups Count","type":"integer"},"record_ids":{"description":"The deletable rows in display order, capped at the bulk-delete limit.","items":{"format":"uuid","type":"string"},"title":"Record Ids","type":"array"},"truncated":{"description":"Whether duplicate_row_count exceeds the returned record IDs.","title":"Truncated","type":"boolean"}},"required":["groups_count","duplicate_row_count","record_ids","truncated"],"title":"TableColumnDuplicatesResponseSchema","type":"object"},"TableColumnGenerateRequestSchema":{"description":"Request body for generating a formula definition from a description.","properties":{"instruction":{"description":"A natural-language description of the formula to build.","maxLength":2000,"minLength":1,"title":"Instruction","type":"string"}},"required":["instruction"],"title":"TableColumnGenerateRequestSchema","type":"object"},"TableColumnGenerateResponseSchema":{"description":"A generated formula definition, validated but NOT saved.\n\nThe caller reviews it: the same definition shape the editor produces by\nhand, so it flows into the existing preview and create endpoints unchanged.","properties":{"data_type":{"$ref":"#/components/schemas/PropertyType","description":"The data type the generated chain produces."},"definition":{"$ref":"#/components/schemas/TableColumnDefinition-Output","description":"The generated formula definition, ready to preview or create."},"explanation":{"description":"One sentence describing what the chain does.","title":"Explanation","type":"string"},"suggested_name":{"description":"A proposed column name. The editor adopts it when the user has not named the column, so a generated formula is savable without a second step.","title":"Suggested Name","type":"string"}},"required":["definition","data_type","suggested_name","explanation"],"title":"TableColumnGenerateResponseSchema","type":"object"},"TableColumnGroupCreateRequestSchema":{"description":"Request body for grouping columns.","properties":{"column_ids":{"description":"The columns to group; at least two, each currently ungrouped. They are pulled together at the leftmost member's position, keeping their current relative order. The LAST member becomes the group's output.","items":{"format":"uuid","type":"string"},"minItems":2,"title":"Column Ids","type":"array"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"The group's name; omit for the default label.","title":"Name"},"run_condition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Input"},{"type":"null"}],"description":"A per-row gate every member without one of its own inherits. It may not read a column inside the group."},"ui_color":{"anyOf":[{"$ref":"#/components/schemas/TableColumnUIColor"},{"type":"null"}],"description":"Palette token for the group's band; omit for a neutral band."}},"required":["column_ids"],"title":"TableColumnGroupCreateRequestSchema","type":"object"},"TableColumnGroupMemberSchema":{"description":"One group member with its output flag, in the group's display order.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"is_output":{"description":"Whether this member stays visible while the group is collapsed.","title":"Is Output","type":"boolean"}},"required":["column_id","is_output"],"title":"TableColumnGroupMemberSchema","type":"object"},"TableColumnGroupMembershipSchema":{"description":"One column's new group membership, carried by a reorder.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"group_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The group to put the column in, or null to take it out of its group.","title":"Group Id"},"is_output":{"default":false,"description":"Whether the column stays visible while its new group is collapsed. Ignored when `group_id` is null.","title":"Is Output","type":"boolean"}},"required":["column_id","group_id"],"title":"TableColumnGroupMembershipSchema","type":"object"},"TableColumnGroupReadSchema":{"description":"A user-managed column group, membership resolved in position order.","properties":{"collapsed":{"description":"Whether the grid folds the group down to its output members. Purely presentational: folded members' cells are still fetched, so expanding costs nothing.","title":"Collapsed","type":"boolean"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"members":{"description":"The member columns in position order, with their output flags.","items":{"$ref":"#/components/schemas/TableColumnGroupMemberSchema"},"title":"Members","type":"array"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The group's name; null renders the client default label.","title":"Name"},"run_condition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Output"},{"type":"null"}],"description":"The group's per-row gate, verbatim; null gates nothing. Every member without a gate of its own carries a copy in its `run_condition` (marked by `run_condition_group_id`), so the columns themselves say what runs."},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"ui_color":{"anyOf":[{"$ref":"#/components/schemas/TableColumnUIColor"},{"type":"null"}],"description":"Palette token for the group's band, or null for a neutral band. A token rather than a hex: the grid renders light and dark, and one stored colour is only legible in one of them."},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","table_id","name","collapsed","ui_color","members","created_at","updated_at"],"title":"TableColumnGroupReadSchema","type":"object"},"TableColumnGroupUpdateRequestSchema":{"description":"Request body for updating a group (tri-state PATCH; members are full-state).","properties":{"collapsed":{"anyOf":[{"type":"boolean"},{}],"description":"Whether the grid folds the group down to its output members.","title":"Collapsed"},"members":{"anyOf":[{"items":{"$ref":"#/components/schemas/TableColumnGroupMemberSchema"},"type":"array"},{}],"description":"The FULL member list in its new order. Columns newly listed join the group and move into its block; current members left out are removed and land immediately after it. A group always has at least one member and at least one output: an empty list is refused (ungroup to dissolve the group), and so is a list with no output flagged.","title":"Members"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{},{"type":"null"}],"description":"New name. Set to null to restore the default label.","title":"Name"},"run_condition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Input"},{},{"type":"null"}],"description":"New per-row gate for the group. Set to null to clear it, which also clears every member's inherited copy. It may not read a column inside the group.","title":"Run Condition"},"ui_color":{"anyOf":[{"$ref":"#/components/schemas/TableColumnUIColor"},{},{"type":"null"}],"description":"Palette token for the group's band. Set to null for a neutral band.","title":"Ui Color"}},"title":"TableColumnGroupUpdateRequestSchema","type":"object"},"TableColumnKind":{"description":"Kind of a table column.\n\n``MANUAL`` cells are user-editable; ``FORMULA`` cells are a pure computed\nchain over other columns; ``ENRICHMENT`` cells are produced by an external\naction (an AI model, a research agent) run once per row. Formula and\nenrichment cells are both computed (read-only in the grid) but only\nenrichment work leaves the process and costs credits.\n\n``SOURCE`` cells hold one imported record verbatim, written only by the\ntable's import source. Like ``MANUAL`` it is an externally-written leaf\nrather than a computed node (it joins no run plan and derives from no\nother column), but unlike ``MANUAL`` nobody may edit or retype it: the\nwhole point is that a refresh can overwrite it wholesale, and every\n``get_path`` column promoted off it reads paths that only survive while\nits shape does.\n\n``EXPORT`` cells hold the RECEIPT of pushing the row to a connected\ndestination (status, the destination record id, when it happened), never\nthe row's own data. The mirror image of ``SOURCE``: where a source column\nis an externally-written leaf, an export column is an externally-READ\nleaf. It joins the run plan like a computed column (its mappings are\ndependencies, so a changed input re-pushes) but nothing may depend on it\nin turn, nobody may edit it (a hand-edited receipt would silently pin the\nrow out of future pushes), and re-running it means \"push again\", not\n\"re-answer\".\n\n``SEQUENCE`` cells hold a contact's live status in an email sequence, or\nthe messages it sent them, written by the outreach send engine and nobody\nelse: an externally-written leaf with no run plan, no dependencies, no user\nedits, no retyping. A status column, like ``EXPORT`` receipts, may not be\nreferenced in a formula: the status only exists to be looked at, never\nderived from. A messages column may, the way a ``SOURCE`` record may: the\nengine requests a run of its dependents whenever it rewrites a cell. The\ncolumns are created by the sequence that targets the table, not from the\nadd-column catalog.","enum":["manual","formula","enrichment","source","export","sequence"],"title":"TableColumnKind","type":"string"},"TableColumnListResponseSchema":{"description":"A table's columns in position order (non-paginated by design).","properties":{"columns":{"items":{"$ref":"#/components/schemas/TableColumnWithUIPrefsSchema"},"title":"Columns","type":"array"},"groups":{"description":"The table's column groups, membership resolved in position order.","items":{"$ref":"#/components/schemas/TableColumnGroupReadSchema"},"title":"Groups","type":"array"},"total_count":{"title":"Total Count","type":"integer"}},"required":["columns","total_count"],"title":"TableColumnListResponseSchema","type":"object"},"TableColumnNameSuggestionResponseSchema":{"description":"The name a new column would take from a base name, made unique on the table.","properties":{"suggested_name":{"description":"The base name unchanged if free, or its first free \"(n)\" variant.","title":"Suggested Name","type":"string"}},"required":["suggested_name"],"title":"TableColumnNameSuggestionResponseSchema","type":"object"},"TableColumnPreviewRequestSchema":{"description":"Request body for previewing an unsaved formula definition.","properties":{"definition":{"$ref":"#/components/schemas/TableColumnDefinition-Input","description":"The formula definition to evaluate; every other kind, Use AI and agent columns included, is rejected."}},"required":["definition"],"title":"TableColumnPreviewRequestSchema","type":"object"},"TableColumnPreviewResponseSchema":{"description":"Preview results over the table's first rows; nothing is persisted.","properties":{"results":{"items":{"$ref":"#/components/schemas/TableColumnPreviewRowSchema"},"title":"Results","type":"array"}},"required":["results"],"title":"TableColumnPreviewResponseSchema","type":"object"},"TableColumnPreviewRowSchema":{"description":"One row's preview evaluation result.","properties":{"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The evaluation error, when the chain failed.","title":"Error"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"value":{"description":"The evaluated value; numbers surface as JSON numbers.","title":"Value"}},"required":["record_id","value","error"],"title":"TableColumnPreviewRowSchema","type":"object"},"TableColumnPromoteFieldRequestSchema":{"description":"Promote one declared output field of an enrichment into its own column.","properties":{"confirm_overwrite":{"default":false,"description":"Explicit acknowledgement that mapping to an existing column overwrites what that column holds. Required with target_column_id.","title":"Confirm Overwrite","type":"boolean"},"display_name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"The child column's name; the field's name when omitted.","title":"Display Name"},"field_name":{"description":"The declared output field to promote.","maxLength":100,"minLength":1,"title":"Field Name","type":"string"},"target_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Map onto this EXISTING manual column instead of creating one. The field's current values overwrite everything the column holds. Destructive; requires confirm_overwrite.","title":"Target Column Id"}},"required":["field_name"],"title":"TableColumnPromoteFieldRequestSchema","type":"object"},"TableColumnReadSchema":{"description":"A table column with its definition and dependency metadata.","properties":{"ai_made":{"default":false,"description":"Whether the AI assistant created this column through a workspace action. A fact about who made it, not a state: it stays true after a person edits the column.","title":"Ai Made","type":"boolean"},"auto_run":{"default":true,"description":"Whether data changes recompute this column by themselves; explicit runs ignore it.","title":"Auto Run","type":"boolean"},"column_type":{"$ref":"#/components/schemas/TableColumnType","description":"The semantic type; what the cell renders and validates as."},"created_at":{"format":"date-time","title":"Created At","type":"string"},"data_type":{"$ref":"#/components/schemas/PropertyType","description":"The storage type `column_type` resolves to, and so which typed value slot the cells live in. Derived, never chosen."},"definition":{"$ref":"#/components/schemas/TableColumnDefinition-Output","description":"The stored definition, verbatim."},"definition_version":{"description":"Bumped on definition changes; cosmetic edits leave it untouched.","title":"Definition Version","type":"integer"},"depends_on_column_ids":{"description":"Direct chain inputs; empty for manual columns.","items":{"format":"uuid","type":"string"},"title":"Depends On Column Ids","type":"array"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Author-written note on what the column holds; null when unset.","title":"Description"},"display_name":{"title":"Display Name","type":"string"},"group_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The column group this column belongs to, or null. Groups are user-managed entities delivered on the column list's `groups`; this field is the membership edge, and the members' order is simply the columns' position order.","title":"Group Id"},"id":{"format":"uuid","title":"Id","type":"string"},"is_group_output":{"description":"Whether this member stays visible while its group is collapsed. Meaningful only while `group_id` is set. Every group keeps at least one output.","title":"Is Group Output","type":"boolean"},"kind":{"$ref":"#/components/schemas/TableColumnKind"},"pending_recompute":{"default":false,"description":"The definition has changed since these cells were last computed, so they are stale. Set by a save made with `suppress_run`, cleared when the column next finishes a run.","title":"Pending Recompute","type":"boolean"},"position":{"title":"Position","type":"integer"},"refresh_interval_hours":{"default":0,"description":"Self re-run cadence in hours; 0 is off.","title":"Refresh Interval Hours","type":"integer"},"run_condition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Output"},{"type":"null"}],"description":"The per-row gate, verbatim; null runs every row."},"run_condition_group_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"When set, `run_condition` is inherited from this column group and is rewritten whenever the group's changes. Set a `run_condition` on the column to override it, or clear the column's to inherit again.","title":"Run Condition Group Id"},"run_condition_view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"When set, the column follows this saved view's filter as its run condition. The engine evaluates view membership at run time rather than reading `run_condition`. Editing the run condition directly detaches from the view.","title":"Run Condition View Id"},"run_delay_seconds":{"default":0,"description":"Pre-run wait in seconds; 0 runs immediately.","title":"Run Delay Seconds","type":"integer"},"supported_filter_operators":{"description":"Every filter operator this column admits, in display order. The server owns the list so a picker cannot offer a pairing the rows query will reject: value operators follow the storage slot, and a computed column additionally admits the execution-state family (has an error, has results, has not run, is stale, ...), which reads run metadata a manual column never writes.","items":{"$ref":"#/components/schemas/TableFilterOperator"},"title":"Supported Filter Operators","type":"array"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"type_options":{"anyOf":[{"$ref":"#/components/schemas/TableColumnTypeOptions-Output"},{"type":"null"}],"description":"Per-type options; null means the type's defaults."},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","table_id","display_name","description","definition","kind","column_type","type_options","data_type","depends_on_column_ids","group_id","is_group_output","supported_filter_operators","definition_version","position","created_at","updated_at"],"title":"TableColumnReadSchema","type":"object"},"TableColumnReorderRequestSchema":{"description":"Request body for reordering a table's columns (full permutation).","properties":{"column_ids":{"description":"Every column of the table exactly once, in the new display order.","items":{"format":"uuid","type":"string"},"maxItems":100,"minItems":1,"title":"Column Ids","type":"array"},"group_membership":{"description":"Columns this reorder also moves in or out of a column group; columns left out keep the group they are in. This is how a drag that drops a column between two members of a group makes it a member: the new order and the new membership land together, so the group is never momentarily split. A group the list would leave with no member, or with no output, is refused rather than repaired.","items":{"$ref":"#/components/schemas/TableColumnGroupMembershipSchema"},"title":"Group Membership","type":"array"}},"required":["column_ids"],"title":"TableColumnReorderRequestSchema","type":"object"},"TableColumnRetypePreviewResponseSchema":{"description":"What changing a column's type would do to the values already in it.\n\nAsking changes nothing. When the type does change, every value the new type\ncan read is converted into it; ``cleared_count`` is the rest, which are left\nblank, so it is the number a person confirms before the change is made.","properties":{"cleared_count":{"description":"Of those, how many the new type cannot hold and would be cleared.","title":"Cleared Count","type":"integer"},"column_type":{"$ref":"#/components/schemas/TableColumnType","description":"The type the preview is for."},"value_count":{"description":"Cells in the column that hold a value today.","title":"Value Count","type":"integer"}},"required":["column_type","value_count","cleared_count"],"title":"TableColumnRetypePreviewResponseSchema","type":"object"},"TableColumnRunEstimateResponseSchema":{"description":"Estimated credit cost of an on-demand column run, before running it.\n\nFree runs (formula/manual columns) estimate to zero and are always\nsufficient, even at a zero balance. The figure is an estimate: row counts\nand cell freshness can shift between estimating and running.","properties":{"balance_sufficient":{"description":"Whether the organization's available credits cover the estimate.","title":"Balance Sufficient","type":"boolean"},"cells_total":{"description":"All cells the run would compute, charged or not.","title":"Cells Total","type":"integer"},"columns":{"description":"Every enrichment or export column the run would work on, in the order it runs: the column asked for first, then the columns that read it. Each with the most its part can cost and what it usually costs.","items":{"$ref":"#/components/schemas/ColumnRunEstimateSchema"},"title":"Columns","type":"array"},"estimated_credits":{"description":"The most the run can cost, in credits: every row of every paid column charged its full per-row price. What the credit hold and the confirmation gate reason about.","title":"Estimated Credits","type":"number"},"expected_credits":{"default":0.0,"description":"What a run like this usually costs, in credits: a column charged by use (an AI column) at the share of its per-row maximum the same kind of cell has actually been charged (a typical share while there is no history yet), every other column at its price. Quote both: up to estimated_credits, usually about expected_credits. Equal to estimated_credits for a flat price (no column charged by use, as in a run of enrichments): then quote that one figure, without up to.","title":"Expected Credits","type":"number"},"export_writes":{"description":"Export columns this run would fire. Present so the confirmation can name the destination, the object and the action instead of only a row count. Empty for a run that writes nothing outside this table.","items":{"$ref":"#/components/schemas/ExportWriteEstimateSchema"},"title":"Export Writes","type":"array"},"is_estimate":{"description":"Always true: freshness and row counts can shift by run time.","title":"Is Estimate","type":"boolean"},"requires_confirmation":{"default":false,"description":"True when the estimate crosses the confirmation threshold: ask before spending instead of running on first click.","title":"Requires Confirmation","type":"boolean"},"rows_held_back":{"default":0,"description":"Rows in scope the column's run condition would hold back. Already subtracted from rows_in_scope.","title":"Rows Held Back","type":"integer"},"rows_in_scope":{"default":0,"description":"Rows the run would cover. This is what a scope choice is about, and what the credit estimate is derived from; `cells_total` also counts the dependent columns the run would recompute.","title":"Rows In Scope","type":"integer"},"scope_too_large":{"default":false,"description":"True when the filtered view names more rows than a run may be scoped to (`view_scope_max_rows`). `rows_in_scope` still carries the matching count; the run itself would be refused with `scope_too_large`. Narrow the filter, or run the whole table.","title":"Scope Too Large","type":"boolean"},"unit_price":{"description":"Blended credits per charged cell (total estimate / units); 0 for free runs.","title":"Unit Price","type":"number"},"units":{"description":"Cells that would incur a charge (0 for free runs).","title":"Units","type":"integer"}},"required":["units","unit_price","estimated_credits","cells_total","is_estimate","balance_sufficient"],"title":"TableColumnRunEstimateResponseSchema","type":"object"},"TableColumnRunRequestSchema":{"description":"Scope for an on-demand recompute of one formula column.","properties":{"limit":{"anyOf":[{"maximum":10000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Row count for scope=first_n (default 10).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"Starting-row offset in display order for scope=first_n; omit to start at the first row.","title":"Offset"},"record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The target row for scope=cell; see also record_ids.","title":"Record Id"},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":1000,"type":"array"},{"type":"null"}],"description":"The target rows for scope=cell: a swept selection re-runs in one request rather than one per cell. Wins over record_id when both are sent; scope=cell requires at least one of the two.","title":"Record Ids"},"row_status":{"anyOf":[{"$ref":"#/components/schemas/TableRowStatus"},{"type":"null"}],"description":"The grid's active smart view (errored or fully computed rows). ANDed with `where`."},"scope":{"$ref":"#/components/schemas/TableRunScope","description":"Row scope: all | errored | unfilled | first_n | cell."},"sorts":{"anyOf":[{"items":{"$ref":"#/components/schemas/TableRowSortSchema"},"maxItems":8,"type":"array"},{"type":"null"}],"description":"The grid's active sort, so `first_n` means the first N rows the person can SEE rather than the first N in stored order. Ignored by every other scope.","title":"Sorts"},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"The grid's active filter, in the rows query's own vocabulary. Narrows every scope but `cell` to the matching rows: `all` runs every matching row (as an explicit list, so at most `view_scope_max_rows` may match), `errored` / `unfilled` keep only matching rows, `first_n` counts within them. Omit for the whole table."}},"required":["scope"],"title":"TableColumnRunRequestSchema","type":"object"},"TableColumnRunResponseSchema":{"description":"Result of requesting an on-demand column run.\n\n``run`` is None when the workflow start is still queued (the run row is\nminted post-commit). The frontend's 2-second active-runs poll picks it up.","properties":{"request_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The id of this run request. The run is minted with it as its origin, so it is known at once, even while `run` is still null.","title":"Request Id"},"run":{"anyOf":[{"$ref":"#/components/schemas/TableRunReadSchema"},{"type":"null"}]}},"required":["run"],"title":"TableColumnRunResponseSchema","type":"object"},"TableColumnType":{"description":"The type a user picks for a table column.\n\nOrdered as the picker shows them, which is also the order the groups below\nrun in: text-ish, then numeric, then choice, then structured.","enum":["text","paragraph","url","email","image_url","person","select","number","decimal","currency","checkbox","date","multi_select","list","object"],"title":"TableColumnType","type":"string"},"TableColumnTypeOptions-Input":{"description":"Discriminated union of per-type column options.\n\nMirrors ``TableColumnDefinition``: a ``RootModel`` because ``PydanticJSON``\nneeds a ``BaseModel`` subclass to (de)serialize the stored JSON, discriminated\non the field that names the member. Consumers reach the concrete member\nthrough ``.root``.\n\nTypes absent from the union simply have no options. The stored column is\nNULL, meaning \"whatever the defaults are now\". Defaults are never written\ninto rows.","discriminator":{"mapping":{"currency":"#/components/schemas/CurrencyOptions","decimal":"#/components/schemas/DecimalOptions","multi_select":"#/components/schemas/MultiSelectOptions","select":"#/components/schemas/SelectOptions"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/SelectOptions"},{"$ref":"#/components/schemas/MultiSelectOptions"},{"$ref":"#/components/schemas/CurrencyOptions"},{"$ref":"#/components/schemas/DecimalOptions"}],"title":"TableColumnTypeOptions"},"TableColumnTypeOptions-Output":{"description":"Discriminated union of per-type column options.\n\nMirrors ``TableColumnDefinition``: a ``RootModel`` because ``PydanticJSON``\nneeds a ``BaseModel`` subclass to (de)serialize the stored JSON, discriminated\non the field that names the member. Consumers reach the concrete member\nthrough ``.root``.\n\nTypes absent from the union simply have no options. The stored column is\nNULL, meaning \"whatever the defaults are now\". Defaults are never written\ninto rows.","discriminator":{"mapping":{"currency":"#/components/schemas/CurrencyOptions","decimal":"#/components/schemas/DecimalOptions","multi_select":"#/components/schemas/MultiSelectOptions","select":"#/components/schemas/SelectOptions"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/SelectOptions"},{"$ref":"#/components/schemas/MultiSelectOptions"},{"$ref":"#/components/schemas/CurrencyOptions"},{"$ref":"#/components/schemas/DecimalOptions"}],"title":"TableColumnTypeOptions"},"TableColumnUIColor":{"description":"Semantic tint token, shared by a column and by a column GROUP.\n\nStored as a token rather than a hex value because the grid renders in both a\nlight and a dark theme, and a single stored colour is only legible in one of\nthem. The client maps each token to a per-mode value.\n\nDeliberately excludes teal: the brand primary is used for range selection and\nthe anchor outline, so a teal column would read as permanently selected.\n\nLives HERE rather than in ``table_column_prefs``, where it started, because\ntwo domains now need it and the layering only allows one direction. A\ncolumn's tint is stored in ``table_column_prefs`` (org-shared appearance,\nkeyed by column) while a group's is a field on the group row itself in\n``table_column``, and ``table_column_prefs`` sits ABOVE ``table_column`` in\nthe domain layers, so the token had to move DOWN to be reachable from both.\n``table_column_prefs.types`` re-exports it, which is why that move touched\nno existing import.\n\nOne enum for both on purpose: a colour token is a shared vocabulary (a team\nagreeing that amber means \"needs review\" is agreeing about it across\ncolumns and groups alike) and the organisation's renaming of the palette\n(``table_column_color_labels``) is keyed by this token, so a second enum\nwould give groups colours the rename dialog could not name.","enum":["gray","red","orange","amber","green","blue","purple","pink"],"title":"TableColumnUIColor","type":"string"},"TableColumnUIPrefsSchema":{"description":"How one column is displayed to the caller.\n\nHidden, pinned and width are the caller's own where they set one, laid over\nthe team's; the colour tint is the team's. An API key sees the team's alone.\nAlways present on a column, whether or not anything has been customised:\na column nobody has touched reports the defaults rather than null.","properties":{"color":{"anyOf":[{"$ref":"#/components/schemas/TableColumnUIColor"},{"type":"null"}],"description":"Semantic palette token the client maps per theme; null means untinted."},"hidden":{"description":"Whether the grid omits the column; its cell values are untouched.","title":"Hidden","type":"boolean"},"pinned":{"description":"Whether the column is frozen to the left edge through horizontal scroll.","title":"Pinned","type":"boolean"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Rendered width in pixels; null means the client default.","title":"Width"}},"required":["hidden","pinned","width","color"],"title":"TableColumnUIPrefsSchema","type":"object"},"TableColumnUIPrefsUpdateSchema":{"description":"Request body for updating a column's display preferences (tri-state PATCH).","properties":{"color":{"anyOf":[{"$ref":"#/components/schemas/TableColumnUIColor"},{},{"type":"null"}],"description":"New palette token, the same for everyone. Set to null to clear the tint.","title":"Color"},"hidden":{"anyOf":[{"type":"boolean"},{}],"description":"Hide the column from the grid, or show it. A signed-in person's choice is their own and stays theirs over the team's; an API key sets the team's.","title":"Hidden"},"pinned":{"anyOf":[{"type":"boolean"},{}],"description":"Pin the column to the left edge, or unpin it. A signed-in person's choice is their own and stays theirs over the team's; an API key sets the team's.","title":"Pinned"},"width":{"anyOf":[{"maximum":720.0,"minimum":64.0,"type":"integer"},{},{"type":"null"}],"description":"New width in pixels, for a signed-in person their own. Null makes a person's column follow the team's width again; from an API key it restores the client default for the team.","title":"Width"}},"title":"TableColumnUIPrefsUpdateSchema","type":"object"},"TableColumnUpdateResultSchema":{"description":"A column update result; the recompute run (if due) appears on the next poll.","properties":{"ai_made":{"default":false,"description":"Whether the AI assistant created this column through a workspace action. A fact about who made it, not a state: it stays true after a person edits the column.","title":"Ai Made","type":"boolean"},"auto_run":{"default":true,"description":"Whether data changes recompute this column by themselves; explicit runs ignore it.","title":"Auto Run","type":"boolean"},"cleared_count":{"description":"Values a type change could not convert into the new type and left blank; 0 when no value moved.","title":"Cleared Count","type":"integer"},"column_type":{"$ref":"#/components/schemas/TableColumnType","description":"The semantic type; what the cell renders and validates as."},"created_at":{"format":"date-time","title":"Created At","type":"string"},"data_type":{"$ref":"#/components/schemas/PropertyType","description":"The storage type `column_type` resolves to, and so which typed value slot the cells live in. Derived, never chosen."},"definition":{"$ref":"#/components/schemas/TableColumnDefinition-Output","description":"The stored definition, verbatim."},"definition_version":{"description":"Bumped on definition changes; cosmetic edits leave it untouched.","title":"Definition Version","type":"integer"},"depends_on_column_ids":{"description":"Direct chain inputs; empty for manual columns.","items":{"format":"uuid","type":"string"},"title":"Depends On Column Ids","type":"array"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Author-written note on what the column holds; null when unset.","title":"Description"},"display_name":{"title":"Display Name","type":"string"},"group_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The column group this column belongs to, or null. Groups are user-managed entities delivered on the column list's `groups`; this field is the membership edge, and the members' order is simply the columns' position order.","title":"Group Id"},"id":{"format":"uuid","title":"Id","type":"string"},"is_group_output":{"description":"Whether this member stays visible while its group is collapsed. Meaningful only while `group_id` is set. Every group keeps at least one output.","title":"Is Group Output","type":"boolean"},"kind":{"$ref":"#/components/schemas/TableColumnKind"},"pending_recompute":{"default":false,"description":"The definition has changed since these cells were last computed, so they are stale. Set by a save made with `suppress_run`, cleared when the column next finishes a run.","title":"Pending Recompute","type":"boolean"},"position":{"title":"Position","type":"integer"},"refresh_interval_hours":{"default":0,"description":"Self re-run cadence in hours; 0 is off.","title":"Refresh Interval Hours","type":"integer"},"requires_recompute":{"description":"Whether the update marked the column for recompute. The run itself arrives via the active-runs poll, never in this response.","title":"Requires Recompute","type":"boolean"},"run_condition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Output"},{"type":"null"}],"description":"The per-row gate, verbatim; null runs every row."},"run_condition_group_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"When set, `run_condition` is inherited from this column group and is rewritten whenever the group's changes. Set a `run_condition` on the column to override it, or clear the column's to inherit again.","title":"Run Condition Group Id"},"run_condition_view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"When set, the column follows this saved view's filter as its run condition. The engine evaluates view membership at run time rather than reading `run_condition`. Editing the run condition directly detaches from the view.","title":"Run Condition View Id"},"run_delay_seconds":{"default":0,"description":"Pre-run wait in seconds; 0 runs immediately.","title":"Run Delay Seconds","type":"integer"},"supported_filter_operators":{"description":"Every filter operator this column admits, in display order. The server owns the list so a picker cannot offer a pairing the rows query will reject: value operators follow the storage slot, and a computed column additionally admits the execution-state family (has an error, has results, has not run, is stale, ...), which reads run metadata a manual column never writes.","items":{"$ref":"#/components/schemas/TableFilterOperator"},"title":"Supported Filter Operators","type":"array"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"type_options":{"anyOf":[{"$ref":"#/components/schemas/TableColumnTypeOptions-Output"},{"type":"null"}],"description":"Per-type options; null means the type's defaults."},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","table_id","display_name","description","definition","kind","column_type","type_options","data_type","depends_on_column_ids","group_id","is_group_output","supported_filter_operators","definition_version","position","created_at","updated_at","requires_recompute","cleared_count"],"title":"TableColumnUpdateResultSchema","type":"object"},"TableColumnUpdateSchema":{"description":"Request body for updating a table column (tri-state PATCH semantics).","properties":{"auto_run":{"anyOf":[{"type":"boolean"},{}],"description":"Whether data changes recompute this column by themselves. Off, its cells go visibly stale and wait for an explicit run.","title":"Auto Run"},"column_type":{"anyOf":[{"$ref":"#/components/schemas/TableColumnType"},{}],"description":"New semantic type; any type may be requested. A change that stores values differently converts every value it can into the new type, and the response's cleared_count says how many it could not and left blank. The retype-preview endpoint forecasts this before you save.","title":"Column Type"},"data_type":{"anyOf":[{"$ref":"#/components/schemas/PropertyType"},{}],"description":"DEPRECATED: send `column_type` instead. Read as the plain column type for that storage type, and ignored when `column_type` is set.","title":"Data Type"},"definition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Input"},{}],"description":"New definition; replaces the whole union member. The kind is immutable.","title":"Definition"},"description":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{},{"type":"null"}],"description":"New description. Set to null to clear.","title":"Description"},"display_name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{}],"title":"Display Name"},"expand_output_fields":{"default":true,"description":"For a multi-field enrichment, keep the fan-out in step with the declared output: create one child column per scalar output field this edit ADDS (the same fan-out a column of the same shape gets when it is created), and DELETE the column of a field it REMOVES, along with that column's values. A removed field's column reads a key the answer no longer carries, so it could only ever sit empty. A field the column already declared is left alone, and a column another column depends on is kept rather than breaking it. Set false to change the output without touching any other column.","title":"Expand Output Fields","type":"boolean"},"output_column_names":{"additionalProperties":{"maxLength":255,"minLength":1,"type":"string"},"description":"What to CALL each child column this edit ADDS, keyed by output field name (the create request's field, read the same way). Without it a new child's header is derived from the field's key, which reads a hand-written name back as though it were one: a field called 'LinkedIn URL' becomes the column 'Linked In Url'. A field with no entry keeps the derived name, a name already taken on the table falls back to the derived one rather than losing the column, and a field this edit did not add is ignored. Ignored when expand_output_fields is false. Children that already exist are never renamed.","maxProperties":50,"propertyNames":{"maxLength":100,"minLength":1},"title":"Output Column Names","type":"object"},"position":{"anyOf":[{"minimum":0.0,"type":"integer"},{}],"title":"Position"},"refresh_interval_hours":{"anyOf":[{"type":"integer"},{}],"description":"New self re-run cadence in hours; 0 turns it off.","ge":0,"le":8760,"title":"Refresh Interval Hours"},"run_condition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Input"},{},{"type":"null"}],"description":"A formula whose result gates this column per row: the cell runs only where it evaluates truthy, and rows where it does not are left as they are rather than cleared. Null runs every row. A gate that fails to evaluate does NOT hold a row back: an unknown answer runs.","title":"Run Condition"},"run_condition_view_id":{"anyOf":[{"format":"uuid","type":"string"},{},{"type":"null"}],"description":"A saved view whose filter this column follows as its run condition, evaluated at run time so the gate tracks the view. Null detaches and goes back to running every row. Mutually exclusive with a non-null `run_condition` in the same request; omit it to leave the link alone.","title":"Run Condition View Id"},"run_delay_seconds":{"anyOf":[{"type":"integer"},{}],"description":"New pre-run wait in seconds; 0 runs immediately. Capped at 600.","ge":0,"le":600,"title":"Run Delay Seconds"},"suppress_run":{"default":false,"description":"Save the change without recomputing. The column's cells keep their current values and `pending_recompute` is set, so the staleness is recorded rather than hidden; run the column when you are ready. A plain bool, not tri-state: it instructs THIS request and has no 'leave unchanged' meaning to carry over.","title":"Suppress Run","type":"boolean"},"type_options":{"anyOf":[{"$ref":"#/components/schemas/TableColumnTypeOptions-Input"},{},{"type":"null"}],"description":"New per-type options. Set to null to clear them back to defaults.","title":"Type Options"}},"title":"TableColumnUpdateSchema","type":"object"},"TableColumnWithUIPrefsSchema":{"description":"A column plus its display preferences as the caller sees them.\n\nHidden, pinned and width are the caller's own laid over the team's; the\ncolour is the team's.\n\nOnly the list payloads carry preferences: they are the ones the grid renders\nfrom. Create and update responses stay on the bare read schema rather than\nadvertising a preferences object they did not fetch.","properties":{"ai_made":{"default":false,"description":"Whether the AI assistant created this column through a workspace action. A fact about who made it, not a state: it stays true after a person edits the column.","title":"Ai Made","type":"boolean"},"auto_run":{"default":true,"description":"Whether data changes recompute this column by themselves; explicit runs ignore it.","title":"Auto Run","type":"boolean"},"column_type":{"$ref":"#/components/schemas/TableColumnType","description":"The semantic type; what the cell renders and validates as."},"created_at":{"format":"date-time","title":"Created At","type":"string"},"data_type":{"$ref":"#/components/schemas/PropertyType","description":"The storage type `column_type` resolves to, and so which typed value slot the cells live in. Derived, never chosen."},"definition":{"$ref":"#/components/schemas/TableColumnDefinition-Output","description":"The stored definition, verbatim."},"definition_version":{"description":"Bumped on definition changes; cosmetic edits leave it untouched.","title":"Definition Version","type":"integer"},"depends_on_column_ids":{"description":"Direct chain inputs; empty for manual columns.","items":{"format":"uuid","type":"string"},"title":"Depends On Column Ids","type":"array"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Author-written note on what the column holds; null when unset.","title":"Description"},"display_name":{"title":"Display Name","type":"string"},"group_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The column group this column belongs to, or null. Groups are user-managed entities delivered on the column list's `groups`; this field is the membership edge, and the members' order is simply the columns' position order.","title":"Group Id"},"id":{"format":"uuid","title":"Id","type":"string"},"is_group_output":{"description":"Whether this member stays visible while its group is collapsed. Meaningful only while `group_id` is set. Every group keeps at least one output.","title":"Is Group Output","type":"boolean"},"kind":{"$ref":"#/components/schemas/TableColumnKind"},"pending_recompute":{"default":false,"description":"The definition has changed since these cells were last computed, so they are stale. Set by a save made with `suppress_run`, cleared when the column next finishes a run.","title":"Pending Recompute","type":"boolean"},"position":{"title":"Position","type":"integer"},"refresh_interval_hours":{"default":0,"description":"Self re-run cadence in hours; 0 is off.","title":"Refresh Interval Hours","type":"integer"},"run_condition":{"anyOf":[{"$ref":"#/components/schemas/TableColumnDefinition-Output"},{"type":"null"}],"description":"The per-row gate, verbatim; null runs every row."},"run_condition_group_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"When set, `run_condition` is inherited from this column group and is rewritten whenever the group's changes. Set a `run_condition` on the column to override it, or clear the column's to inherit again.","title":"Run Condition Group Id"},"run_condition_view_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"When set, the column follows this saved view's filter as its run condition. The engine evaluates view membership at run time rather than reading `run_condition`. Editing the run condition directly detaches from the view.","title":"Run Condition View Id"},"run_delay_seconds":{"default":0,"description":"Pre-run wait in seconds; 0 runs immediately.","title":"Run Delay Seconds","type":"integer"},"supported_filter_operators":{"description":"Every filter operator this column admits, in display order. The server owns the list so a picker cannot offer a pairing the rows query will reject: value operators follow the storage slot, and a computed column additionally admits the execution-state family (has an error, has results, has not run, is stale, ...), which reads run metadata a manual column never writes.","items":{"$ref":"#/components/schemas/TableFilterOperator"},"title":"Supported Filter Operators","type":"array"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"type_options":{"anyOf":[{"$ref":"#/components/schemas/TableColumnTypeOptions-Output"},{"type":"null"}],"description":"Per-type options; null means the type's defaults."},"ui_prefs":{"$ref":"#/components/schemas/TableColumnUIPrefsSchema","description":"How the column is displayed; all-defaults when nothing is customised."},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","table_id","display_name","description","definition","kind","column_type","type_options","data_type","depends_on_column_ids","group_id","is_group_output","supported_filter_operators","definition_version","position","created_at","updated_at","ui_prefs"],"title":"TableColumnWithUIPrefsSchema","type":"object"},"TableColumnsBatchDeleteRequestSchema":{"description":"Request body for deleting several columns as one batch.","properties":{"column_ids":{"description":"The columns to delete. Dependents inside the batch never block it; dependents outside it still do.","items":{"format":"uuid","type":"string"},"minItems":1,"title":"Column Ids","type":"array"},"replace_with_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Repoint surviving dependents' references at this column before deleting. Omit to refuse the delete while outside dependents exist.","title":"Replace With Column Id"}},"required":["column_ids"],"title":"TableColumnsBatchDeleteRequestSchema","type":"object"},"TableColumnsChangedEventSchema":{"description":"A column was created, edited, deleted, or reordered. Refetch columns and rows.","properties":{"kind":{"const":"columns_changed","default":"columns_changed","title":"Kind","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id"],"title":"TableColumnsChangedEventSchema","type":"object"},"TableColumnsRunRequestSchema":{"description":"Cell-scoped run over several columns at once, as ONE dependency-ordered plan.","properties":{"column_ids":{"description":"The computed columns to run, in any order. A column another one here feeds is planned once, AFTER its input, so no column reads a value a sibling is still computing. Sending one request per column instead is what makes them race.","items":{"format":"uuid","type":"string"},"maxItems":100,"minItems":1,"title":"Column Ids","type":"array"},"record_ids":{"description":"The target rows, shared by every column named. A swept selection is a rectangle. Duplicates are dropped and the order is kept.","items":{"format":"uuid","type":"string"},"maxItems":1000,"minItems":1,"title":"Record Ids","type":"array"}},"required":["column_ids","record_ids"],"title":"TableColumnsRunRequestSchema","type":"object"},"TableColumnsWatermarkSchema":{"description":"The columns change watermark: column count plus newest column write.","properties":{"count":{"description":"Number of columns in the table.","title":"Count","type":"integer"},"max_updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Newest column updated_at; null when the table has no columns. Moves on create, rename, definition change, and reorder; deletes move `count`. Compare for inequality, never ordering.","title":"Max Updated At"}},"required":["count","max_updated_at"],"title":"TableColumnsWatermarkSchema","type":"object"},"TableCompanyDomain-Input":{"description":"Reduce a company's website URL to the company's own registrable domain.\n\nThree differences from ``url_domain``, which stays the generic read (a\ncolumn of LinkedIn profile URLs legitimately reduces to ``linkedin.com``\nthere):\n\nHosts that name a platform rather than the company (LinkedIn and Facebook\npages, link aggregators, review sites, vendor partner directories) come out\nempty. A company whose only listed website is its LinkedIn page has no\nderivable domain, and an empty cell says so; ``linkedin.com`` is worse than\nempty because it joins, dedupes and syncs as if it were real.\n\nThe result is the domain someone REGISTERED, not the bare host: a provider\nthat lists ``careers.acme.com`` is describing ``acme.com``. A subdomain\njoins against nothing and sends an agent somewhere that often does not\nresolve. Page builders that give each customer their own label are the\nexception the Public Suffix List already encodes, so ``acme.wixsite.com``\nsurvives whole rather than collapsing into ``wixsite.com``.\n\n``company_name`` guards the case those two cannot: a directory listing\nreduces to the DIRECTORY owner's domain, so\n``cloudpartners.transform.microsoft.com`` becomes ``microsoft.com``: right\nshape, wrong company, and nothing downstream can tell. Pointed at the\ncolumn naming the employer, the domain is dropped when the two disagree.\nOptional: without it the other two rules still apply.","properties":{"company_name":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Company Name"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"company_domain","default":"company_domain","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableCompanyDomain","type":"object"},"TableCompanyDomain-Output":{"description":"Reduce a company's website URL to the company's own registrable domain.\n\nThree differences from ``url_domain``, which stays the generic read (a\ncolumn of LinkedIn profile URLs legitimately reduces to ``linkedin.com``\nthere):\n\nHosts that name a platform rather than the company (LinkedIn and Facebook\npages, link aggregators, review sites, vendor partner directories) come out\nempty. A company whose only listed website is its LinkedIn page has no\nderivable domain, and an empty cell says so; ``linkedin.com`` is worse than\nempty because it joins, dedupes and syncs as if it were real.\n\nThe result is the domain someone REGISTERED, not the bare host: a provider\nthat lists ``careers.acme.com`` is describing ``acme.com``. A subdomain\njoins against nothing and sends an agent somewhere that often does not\nresolve. Page builders that give each customer their own label are the\nexception the Public Suffix List already encodes, so ``acme.wixsite.com``\nsurvives whole rather than collapsing into ``wixsite.com``.\n\n``company_name`` guards the case those two cannot: a directory listing\nreduces to the DIRECTORY owner's domain, so\n``cloudpartners.transform.microsoft.com`` becomes ``microsoft.com``: right\nshape, wrong company, and nothing downstream can tell. Pointed at the\ncolumn naming the employer, the domain is dropped when the two disagree.\nOptional: without it the other two rules still apply.","properties":{"company_name":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Company Name"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"company_domain","default":"company_domain","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableCompanyDomain","type":"object"},"TableConcatenate-Input":{"description":"Join several values into one string.\n\nSources are ORDERED and may mix columns with the results of earlier steps:\n``[First name, step 2]`` and ``[step 2, First name]`` are different strings,\nwhich is why there is one list rather than a list of columns beside a list\nof steps.\n\nThe field keeps its original name: every stored definition holds\n``source_column_ids``, and the list is still overwhelmingly columns. Only\nthe item type widened, so old definitions validate untouched.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"concatenate","default":"concatenate","title":"Function","type":"string"},"ignore_empty":{"default":true,"title":"Ignore Empty","type":"boolean"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"separator":{"default":" ","title":"Separator","type":"string"},"source_column_ids":{"description":"Values to join, in order. A UUID reads that column on the row; a step reference reads an earlier step's output.","items":{"anyOf":[{"format":"uuid","type":"string"},{"$ref":"#/components/schemas/StepRef"}]},"title":"Source Column Ids","type":"array"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["source_column_ids"],"title":"TableConcatenate","type":"object"},"TableConcatenate-Output":{"description":"Join several values into one string.\n\nSources are ORDERED and may mix columns with the results of earlier steps:\n``[First name, step 2]`` and ``[step 2, First name]`` are different strings,\nwhich is why there is one list rather than a list of columns beside a list\nof steps.\n\nThe field keeps its original name: every stored definition holds\n``source_column_ids``, and the list is still overwhelmingly columns. Only\nthe item type widened, so old definitions validate untouched.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"concatenate","default":"concatenate","title":"Function","type":"string"},"ignore_empty":{"default":true,"title":"Ignore Empty","type":"boolean"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"separator":{"default":" ","title":"Separator","type":"string"},"source_column_ids":{"description":"Values to join, in order. A UUID reads that column on the row; a step reference reads an earlier step's output.","items":{"anyOf":[{"format":"uuid","type":"string"},{"$ref":"#/components/schemas/StepRef"}]},"title":"Source Column Ids","type":"array"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["source_column_ids"],"title":"TableConcatenate","type":"object"},"TableConditions-Input":{"description":"Fold several comparisons into ONE boolean.\n\nThe engine's only boolean combinator, and the shape a column's\n``run_condition`` is authored in: \"only run where Employees > 50 AND\nCountry is US\". Nothing else here joins predicates: ``if_then_else``\ncompares exactly one pair and returns a value rather than a verdict. So\nwithout this a multi-clause gate could only be reached by chaining steps\nthat pipe a truthy stand-in forward, which no editor could read back.\n\nOne joiner over clauses and, at most one level down, groups of clauses:\n\"A and (B or C)\". That is precisely the row filter's shape, so a view's\nfilter can be saved as a gate and read back as a filter without loss; a\ndeeper tree would be expressible on one side only. Reads its clauses'\noperands directly and ignores the piped input, so it is a leaf rather\nthan a transform.","properties":{"clauses":{"items":{"oneOf":[{"$ref":"#/components/schemas/GateClause"},{"$ref":"#/components/schemas/GateGroup-Input"}]},"maxItems":8,"minItems":1,"title":"Clauses","type":"array"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"conditions","default":"conditions","title":"Function","type":"string"},"joiner":{"default":"and","enum":["and","or"],"title":"Joiner","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["clauses"],"title":"TableConditions","type":"object"},"TableConditions-Output":{"description":"Fold several comparisons into ONE boolean.\n\nThe engine's only boolean combinator, and the shape a column's\n``run_condition`` is authored in: \"only run where Employees > 50 AND\nCountry is US\". Nothing else here joins predicates: ``if_then_else``\ncompares exactly one pair and returns a value rather than a verdict. So\nwithout this a multi-clause gate could only be reached by chaining steps\nthat pipe a truthy stand-in forward, which no editor could read back.\n\nOne joiner over clauses and, at most one level down, groups of clauses:\n\"A and (B or C)\". That is precisely the row filter's shape, so a view's\nfilter can be saved as a gate and read back as a filter without loss; a\ndeeper tree would be expressible on one side only. Reads its clauses'\noperands directly and ignores the piped input, so it is a leaf rather\nthan a transform.","properties":{"clauses":{"items":{"oneOf":[{"$ref":"#/components/schemas/GateClause"},{"$ref":"#/components/schemas/GateGroup-Output"}]},"maxItems":8,"minItems":1,"title":"Clauses","type":"array"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"conditions","default":"conditions","title":"Function","type":"string"},"joiner":{"default":"and","enum":["and","or"],"title":"Joiner","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["clauses"],"title":"TableConditions","type":"object"},"TableCopy-Input":{"description":"Copy the input value unchanged.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"copy","default":"copy","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableCopy","type":"object"},"TableCopy-Output":{"description":"Copy the input value unchanged.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"copy","default":"copy","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableCopy","type":"object"},"TableCountSchema":{"description":"The number of matching tables.","properties":{"count":{"title":"Count","type":"integer"}},"required":["count"],"title":"TableCountSchema","type":"object"},"TableCreateSchema":{"description":"Request body for creating a table.","properties":{"description":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{"type":"null"}],"title":"Description"},"folder_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder to make it in, as when somebody makes a table while looking inside one. Leave it out for the top level of the Tables list.","title":"Folder Id"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"Table name, unique per organisation. Leave it out for a blank table: the server names it \"New table\", or \"New table (2)\" and onward when that name is taken, checked against every table in the workspace.","title":"Name"}},"title":"TableCreateSchema","type":"object"},"TableDateArithmetic-Input":{"description":"Add or subtract a fixed duration from a date value.","properties":{"amount":{"title":"Amount","type":"integer"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"date_arithmetic","default":"date_arithmetic","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"operator":{"enum":["add","subtract"],"title":"Operator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"unit":{"enum":["days","hours","minutes","seconds"],"title":"Unit","type":"string"}},"required":["operator","amount","unit"],"title":"TableDateArithmetic","type":"object"},"TableDateArithmetic-Output":{"description":"Add or subtract a fixed duration from a date value.","properties":{"amount":{"title":"Amount","type":"integer"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"date_arithmetic","default":"date_arithmetic","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"operator":{"enum":["add","subtract"],"title":"Operator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"unit":{"enum":["days","hours","minutes","seconds"],"title":"Unit","type":"string"}},"required":["operator","amount","unit"],"title":"TableDateArithmetic","type":"object"},"TableDateDiff-Input":{"description":"The signed duration between this step's date and another date.\n\n``date_arithmetic`` shifts a date by a CONSTANT amount, so the gap between\ntwo date columns had no expression. Positive when the step's own date is\nthe later of the two.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"date_diff","default":"date_diff","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"other":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Other"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"unit":{"default":"days","enum":["days","hours","minutes","seconds"],"title":"Unit","type":"string"}},"title":"TableDateDiff","type":"object"},"TableDateDiff-Output":{"description":"The signed duration between this step's date and another date.\n\n``date_arithmetic`` shifts a date by a CONSTANT amount, so the gap between\ntwo date columns had no expression. Positive when the step's own date is\nthe later of the two.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"date_diff","default":"date_diff","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"other":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Other"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"unit":{"default":"days","enum":["days","hours","minutes","seconds"],"title":"Unit","type":"string"}},"title":"TableDateDiff","type":"object"},"TableDateExtract-Input":{"description":"Extract a component (year, month, ...) from a date value.","properties":{"component":{"enum":["year","month","day","hour","minute","second"],"title":"Component","type":"string"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"date_extract","default":"date_extract","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["component"],"title":"TableDateExtract","type":"object"},"TableDateExtract-Output":{"description":"Extract a component (year, month, ...) from a date value.","properties":{"component":{"enum":["year","month","day","hour","minute","second"],"title":"Component","type":"string"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"date_extract","default":"date_extract","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["component"],"title":"TableDateExtract","type":"object"},"TableDateFormat-Input":{"description":"Convert a date between iso/unix/unix_ms representations.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"date_format","default":"date_format","title":"Function","type":"string"},"input_format":{"enum":["iso","unix","unix_ms"],"title":"Input Format","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"output_format":{"enum":["iso","unix","unix_ms"],"title":"Output Format","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["input_format","output_format"],"title":"TableDateFormat","type":"object"},"TableDateFormat-Output":{"description":"Convert a date between iso/unix/unix_ms representations.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"date_format","default":"date_format","title":"Function","type":"string"},"input_format":{"enum":["iso","unix","unix_ms"],"title":"Input Format","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"output_format":{"enum":["iso","unix","unix_ms"],"title":"Output Format","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["input_format","output_format"],"title":"TableDateFormat","type":"object"},"TableDeletedEventSchema":{"description":"The table was deleted; the next read will 404.","properties":{"kind":{"const":"table_deleted","default":"table_deleted","title":"Kind","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id"],"title":"TableDeletedEventSchema","type":"object"},"TableDescriptionSuggestionSchema":{"description":"A generated description for a table, for the user to accept or edit.","properties":{"description":{"description":"A one- or two-sentence description of what the table holds, written from its column names and types. Never applied automatically: the caller puts it in the field and the user decides.","title":"Description","type":"string"}},"required":["description"],"title":"TableDescriptionSuggestionSchema","type":"object"},"TableDetectLanguage-Input":{"description":"The language a piece of text is written in, as an ISO 639-1 code.\n\nRoutes a row before anything expensive touches it: which sequence to\nenrol a lead into, which reviewer sees a scraped page, whether to\ntranslate at all.\n\nScript comes first (Cyrillic, Greek, Hebrew, Arabic, Han, kana and\nhangul each answer on their own) and Latin text is decided by the\nfunction words it uses. That is a heuristic, not a model: it is\ndeterministic, free, and honest about not knowing, returning null when\nthe text is too short or matches nothing.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"detect_language","default":"detect_language","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableDetectLanguage","type":"object"},"TableDetectLanguage-Output":{"description":"The language a piece of text is written in, as an ISO 639-1 code.\n\nRoutes a row before anything expensive touches it: which sequence to\nenrol a lead into, which reviewer sees a scraped page, whether to\ntranslate at all.\n\nScript comes first (Cyrillic, Greek, Hebrew, Arabic, Han, kana and\nhangul each answer on their own) and Latin text is decided by the\nfunction words it uses. That is a heuristic, not a model: it is\ndeterministic, free, and honest about not knowing, returning null when\nthe text is too short or matches nothing.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"detect_language","default":"detect_language","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableDetectLanguage","type":"object"},"TableDuplicateRequestSchema":{"description":"Request body for duplicating a table.","properties":{"include_rows":{"default":true,"description":"Copy rows and cell values too. Off duplicates the structure alone: columns, types, formulas, display preferences.","title":"Include Rows","type":"boolean"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"The duplicate's name; omitted derives \"<source> copy\", suffixed until free.","title":"Name"}},"title":"TableDuplicateRequestSchema","type":"object"},"TableEmailPermutations-Input":{"description":"The candidate work-email addresses for a name at a domain.\n\nWhat a verifier needs to be pointed at: nine or so patterns companies\nactually use, in the order they are actually common, so the cheapest\nverification step has a list to work through instead of one guess.\n\nThe piped value is the person's name: \"Ada Lovelace\", or a first name\nwith ``last_name`` supplying the rest. Anything after the first and last\ntoken (middle names, suffixes) is ignored rather than permuted, which is\nwhat keeps the list nine long instead of ninety.","properties":{"domain":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Domain"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"email_permutations","default":"email_permutations","title":"Function","type":"string"},"last_name":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Last Name"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableEmailPermutations","type":"object"},"TableEmailPermutations-Output":{"description":"The candidate work-email addresses for a name at a domain.\n\nWhat a verifier needs to be pointed at: nine or so patterns companies\nactually use, in the order they are actually common, so the cheapest\nverification step has a list to work through instead of one guess.\n\nThe piped value is the person's name: \"Ada Lovelace\", or a first name\nwith ``last_name`` supplying the rest. Anything after the first and last\ntoken (middle names, suffixes) is ignored rather than permuted, which is\nwhat keeps the list nine long instead of ninety.","properties":{"domain":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Domain"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"email_permutations","default":"email_permutations","title":"Function","type":"string"},"last_name":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Last Name"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableEmailPermutations","type":"object"},"TableEnrichmentAuditAction":{"description":"Action types for enrichment audit logs.\n\nBeyond the usual created/updated pair, enrichment actions spend\norganisational money, so run requests, cancellations and the settled\ncost each get their own entry.","enum":["configured","edited","run_requested","run_cancelled","cost_incurred","assistant_applied","assistant_undone"],"title":"TableEnrichmentAuditAction","type":"string"},"TableErroredRunResponseSchema":{"description":"The runs started by a table-wide re-run of failed cells.","properties":{"runs":{"description":"The runs that were minted, in column order. A column whose start is still queued is absent. The active-runs poll surfaces it.","items":{"$ref":"#/components/schemas/TableRunReadSchema"},"title":"Runs","type":"array"}},"required":["runs"],"title":"TableErroredRunResponseSchema","type":"object"},"TableExportFormat":{"description":"The file a table export is downloaded as.\n\nThe two differ in more than their extension. A CSV is text, so every value\nbecomes a string and free text is defanged against a spreadsheet reading a\nleading \"=\" as a formula. A workbook keeps native types, so a number stays\nsummable and a date sorts as a date, and no defanging is needed because a\nstring cell is never evaluated.","enum":["csv","xlsx"],"title":"TableExportFormat","type":"string"},"TableExportRequestSchema":{"description":"Request body for a table file export.\n\nTwo scopes, one body. Send ``sorts``/``where`` to export what the grid is\ncurrently showing, in the same vocabulary the rows query accepts, so a\nfiltered view exports exactly the rows the user can see. Send ``record_ids``\nto export a specific selection instead. The two are mutually exclusive: an\nenumerated selection has already answered the question a filter asks.\n\n``column_ids`` is the projection, in display order, so hiding or reordering\na column in the grid is reflected in the file.\n\n``format`` picks the file. It defaults to CSV, so a client written before\nExcel existed keeps working untouched.","properties":{"column_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":500,"type":"array"},{"type":"null"}],"description":"Export these columns, in this order. Omit for every column, in the table's own column order.","title":"Column Ids"},"format":{"$ref":"#/components/schemas/TableExportFormat","default":"csv","description":"The file to download. `csv` writes every value as text. `xlsx` keeps native types, so numbers stay summable and dates sort as dates."},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":1000,"type":"array"},{"type":"null"}],"description":"Export exactly these rows, in display order. Mutually exclusive with `sorts` and `where`.","title":"Record Ids"},"sorts":{"description":"Order rows by these columns instead of the display order.","items":{"$ref":"#/components/schemas/TableRowSortSchema"},"maxItems":3,"title":"Sorts","type":"array"},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"Export only rows satisfying this predicate tree."}},"title":"TableExportRequestSchema","type":"object"},"TableFailureMode":{"description":"What a formula cell resolves to when a step in its chain fails.\n\nApplies to the whole chain, read off the top-level function only.\n``SKIP`` is equivalent to ``SET_NULL`` for table cells (a cell always has a\nstored slot, so there is nothing to skip). Kept for shape compatibility.","enum":["pass_through_raw","set_null","static","skip"],"title":"TableFailureMode","type":"string"},"TableFavoriteUpdateSchema":{"description":"Request body for starring or unstarring a table.","properties":{"is_favorite":{"description":"Whether this user wants the table starred.","title":"Is Favorite","type":"boolean"}},"required":["is_favorite"],"title":"TableFavoriteUpdateSchema","type":"object"},"TableFilterJoiner":{"description":"How the members of one filter level combine.","enum":["and","or"],"title":"TableFilterJoiner","type":"string"},"TableFilterOperator":{"description":"A row filter predicate.\n\nWhich operators are legal depends on the column's data type; the service\nvalidates the pairing and rejects a mismatch, so an operator here is a\nvocabulary entry rather than a promise it applies everywhere.\n\nTwo families live here. The VALUE operators ask about what a cell holds and\nare keyed off the column's storage slot. The STATE operators ask about what\nthe last run DID to the cell (errored, skipped, never ran, went stale) and\nare keyed off the column's kind instead: they read the compute metadata that\nonly a computed column ever writes, and mean nothing on a hand-typed one.","enum":["eq","neq","gt","gte","lt","lte","contains","not_contains","contains_any_of","not_contains_any_of","starts_with","is_true","is_false","is_empty","is_not_empty","has_error","has_no_error","has_results","has_no_results","has_not_run","is_stale","is_not_stale","run_condition_not_met","run_stopped"],"title":"TableFilterOperator","type":"string"},"TableFolderCreateSchema":{"description":"Request body for making a folder.","properties":{"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"The folder's name. Leave it out for \"Untitled folder\", numbered when the place already has one.","title":"Name"},"parent_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder to make it in; null for the top level.","title":"Parent Id"}},"title":"TableFolderCreateSchema","type":"object"},"TableFolderCrumbSchema":{"description":"One folder on the way to a table, from the top level down.","properties":{"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name"],"title":"TableFolderCrumbSchema","type":"object"},"TableFolderListSchema":{"description":"Every live folder in the workspace, at every level.","properties":{"folders":{"description":"The folders, by name. parent_id says where each one sits.","items":{"$ref":"#/components/schemas/TableFolderSchema"},"title":"Folders","type":"array"}},"required":["folders"],"title":"TableFolderListSchema","type":"object"},"TableFolderSchema":{"description":"A workspace folder, as the Tables list draws it.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"folder_count":{"default":0,"description":"Folders directly in it.","title":"Folder Count","type":"integer"},"id":{"format":"uuid","title":"Id","type":"string"},"last_viewed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the CALLING USER last opened any table in it, at any depth; null when they never have.","title":"Last Viewed At"},"name":{"title":"Name","type":"string"},"nested_archived_count":{"default":0,"description":"Archived tables in it at any depth, which go to Trash with it too.","title":"Nested Archived Count","type":"integer"},"nested_table_count":{"default":0,"description":"Tables in it at any depth, archived ones aside. What deleting it would send to Trash, archived tables added.","title":"Nested Table Count","type":"integer"},"owner_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The owner's name, resolved for display.","title":"Owner Display Name"},"owner_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who to ask about it: whoever made it, unless somebody changed it.","title":"Owner User Id"},"parent_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder it sits in; null for the top level.","title":"Parent Id"},"table_count":{"default":0,"description":"Tables directly in it, archived ones aside.","title":"Table Count","type":"integer"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","parent_id","owner_user_id","created_at","updated_at"],"title":"TableFolderSchema","type":"object"},"TableFolderTrashResultSchema":{"description":"What deleting or restoring a folder moved.","properties":{"folder":{"$ref":"#/components/schemas/TableFolderSchema"},"folder_count":{"description":"Folders that moved, this one included.","title":"Folder Count","type":"integer"},"left_in_trash_table_ids":{"description":"On a restore: tables that stayed in Trash because a live table has taken their name since. Each is now listed in Trash on its own.","items":{"format":"uuid","type":"string"},"title":"Left In Trash Table Ids","type":"array"},"table_ids":{"description":"Tables that moved with it.","items":{"format":"uuid","type":"string"},"title":"Table Ids","type":"array"}},"required":["folder","folder_count","table_ids"],"title":"TableFolderTrashResultSchema","type":"object"},"TableFolderUpdateSchema":{"description":"Request body for renaming, moving or re-owning a folder (omitted fields stay).","properties":{"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{}],"description":"Its new name.","title":"Name"},"owner_user_id":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{},{"type":"null"}],"description":"The workspace member who owns it from now on; null for no owner.","title":"Owner User Id"},"parent_id":{"anyOf":[{"format":"uuid","type":"string"},{},{"type":"null"}],"description":"The folder to move it into; null for the top level.","title":"Parent Id"}},"title":"TableFolderUpdateSchema","type":"object"},"TableFormat-Input":{"description":"Build a string from a positional template and a list of arguments.\n\n``concatenate`` joins whole columns with one separator, which cannot\nproduce \"Enterprise: Acme (12.4%)\". Placeholders are positional only\n(``{0}``, ``{1}``) so the template stays data, not an expression language.\n\nLike ``concatenate`` this takes no ``source_column_id``: its inputs are its\narguments, not the value flowing down the chain.","properties":{"arguments":{"items":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"maxItems":10,"title":"Arguments","type":"array"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"format","default":"format","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"template":{"minLength":1,"title":"Template","type":"string"}},"required":["template"],"title":"TableFormat","type":"object"},"TableFormat-Output":{"description":"Build a string from a positional template and a list of arguments.\n\n``concatenate`` joins whole columns with one separator, which cannot\nproduce \"Enterprise: Acme (12.4%)\". Placeholders are positional only\n(``{0}``, ``{1}``) so the template stays data, not an expression language.\n\nLike ``concatenate`` this takes no ``source_column_id``: its inputs are its\narguments, not the value flowing down the chain.","properties":{"arguments":{"items":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"maxItems":10,"title":"Arguments","type":"array"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"format","default":"format","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"template":{"minLength":1,"title":"Template","type":"string"}},"required":["template"],"title":"TableFormat","type":"object"},"TableFunctionCategory":{"description":"UI grouping for the function catalog.","enum":["string","number","date","list","logic","type_coercion","domain"],"title":"TableFunctionCategory","type":"string"},"TableGetPath-Input":{"description":"Read a dotted path out of an object- or list-valued cell.\n\nObject and list columns were storable but unreadable: nothing in the\ncatalog could reach a field inside one, so an enrichment payload landed in\na cell and stopped there. Segments index dicts by key and lists by integer\nposition: ``employees.count``, ``emails.0.address``.\n\n``output_type`` is declared rather than derived because a JSON path can\nland on anything, and the column's data type has to be known before a\nsingle row is evaluated.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"get_path","default":"get_path","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"output_type":{"$ref":"#/components/schemas/PropertyType","default":"string"},"path":{"minLength":1,"title":"Path","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["path"],"title":"TableGetPath","type":"object"},"TableGetPath-Output":{"description":"Read a dotted path out of an object- or list-valued cell.\n\nObject and list columns were storable but unreadable: nothing in the\ncatalog could reach a field inside one, so an enrichment payload landed in\na cell and stopped there. Segments index dicts by key and lists by integer\nposition: ``employees.count``, ``emails.0.address``.\n\n``output_type`` is declared rather than derived because a JSON path can\nland on anything, and the column's data type has to be known before a\nsingle row is evaluated.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"get_path","default":"get_path","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"output_type":{"$ref":"#/components/schemas/PropertyType","default":"string"},"path":{"minLength":1,"title":"Path","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["path"],"title":"TableGetPath","type":"object"},"TableHash-Input":{"description":"Hash a value: the identifier ad platforms and clean rooms ask for.\n\nUploading an audience means handing over hashed emails, never raw ones,\nand the hash has to be produced the way the platform specifies:\nlowercased and trimmed first, hex digest out. That normalisation is the\npart people get wrong by hand, so it happens here rather than in three\nchained steps.","properties":{"algorithm":{"default":"sha256","enum":["sha256","sha1","md5"],"title":"Algorithm","type":"string"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"hash","default":"hash","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"normalize":{"default":true,"description":"Trim and lowercase before hashing, as ad platforms require.","title":"Normalize","type":"boolean"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableHash","type":"object"},"TableHash-Output":{"description":"Hash a value: the identifier ad platforms and clean rooms ask for.\n\nUploading an audience means handing over hashed emails, never raw ones,\nand the hash has to be produced the way the platform specifies:\nlowercased and trimmed first, hex digest out. That normalisation is the\npart people get wrong by hand, so it happens here rather than in three\nchained steps.","properties":{"algorithm":{"default":"sha256","enum":["sha256","sha1","md5"],"title":"Algorithm","type":"string"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"hash","default":"hash","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"normalize":{"default":true,"description":"Trim and lowercase before hashing, as ad platforms require.","title":"Normalize","type":"boolean"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableHash","type":"object"},"TableHelloEventSchema":{"description":"Opening frame: the stream is live and the client should resync once.","properties":{"heartbeat_seconds":{"description":"Idle heartbeat cadence; treat silence beyond a small multiple as death.","title":"Heartbeat Seconds","type":"integer"},"kind":{"const":"hello","default":"hello","title":"Kind","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","heartbeat_seconds"],"title":"TableHelloEventSchema","type":"object"},"TableIfThenElse-Input":{"description":"Pick one of two values based on a comparison.\n\nEach of the three slots takes a literal or a column, so this expresses both\n\"if this column is over that column\" and \"use A, else use B\". Neither of\nthose was reachable while they were constants.","properties":{"compare_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Compare Value"},"else_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Else Value"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"if_then_else","default":"if_then_else","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"operator":{"enum":["eq","neq","gt","lt","gte","lte","contains","not_contains"],"title":"Operator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"then_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Then Value"}},"required":["operator"],"title":"TableIfThenElse","type":"object"},"TableIfThenElse-Output":{"description":"Pick one of two values based on a comparison.\n\nEach of the three slots takes a literal or a column, so this expresses both\n\"if this column is over that column\" and \"use A, else use B\". Neither of\nthose was reachable while they were constants.","properties":{"compare_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Compare Value"},"else_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Else Value"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"if_then_else","default":"if_then_else","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"operator":{"enum":["eq","neq","gt","lt","gte","lte","contains","not_contains"],"title":"Operator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"then_value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Then Value"}},"required":["operator"],"title":"TableIfThenElse","type":"object"},"TableImportCommitRequestSchema":{"description":"Request body for committing an upload.\n\nSend the mapping the user reviewed. Omitting a field's entry leaves that\ncolumn out of the table entirely, which is how a user drops a column they\ndo not want.","properties":{"columns":{"description":"The reviewed mapping, in display order.","items":{"$ref":"#/components/schemas/ImportColumnMappingSchema"},"maxItems":500,"minItems":1,"title":"Columns","type":"array"},"folder_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder to make the table in, as when the file is imported from inside one on the Tables list. Leave it out for the top level.","title":"Folder Id"},"max_rows":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"How many of the file's data rows to write, counted from the top: 1 or more. Clamped by the plan's own ceiling, so this can only ever import less than the preview's `importable_row_count`, never more. Omit it, or send null, for every row the plan allows; that is also how a file with a header and no data rows is committed. Named for the user's choice, unlike the preview's `row_limit`, which is the plan's cap.","title":"Max Rows"},"row_ranges":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImportRowRangeSchema"},"maxItems":1000,"minItems":1,"type":"array"},{"type":"null"}],"description":"Which of the file's data rows to write, the way a print dialog picks pages: rows 1 to 10 and 21 to 30 are two ranges. Rows are numbered as `row_errors` numbers them, from 1 under the header, blank lines not counted. Overlapping and touching ranges are merged, an end past the file's last row is brought back to it, and a choice bigger than the plan's `row_limit` keeps its first rows up to it. Rows past the preview's `importable_row_count` may be chosen: the plan caps how many rows a table holds, not which. A choice wholly past the end of the file is refused, and so is one of more than 100 ranges once merged. Send this or `max_rows`, never both; omit both for every row the plan allows.","title":"Row Ranges"},"table_name":{"description":"Name for the table this creates.","maxLength":255,"minLength":1,"title":"Table Name","type":"string"}},"required":["table_name","columns"],"title":"TableImportCommitRequestSchema","type":"object"},"TableImportJobResponseSchema":{"description":"A CSV import's current state.\n\nPoll this until `status` is terminal. `imported_rows` climbs as the load\nruns, so it doubles as a progress bar against `total_rows`.","properties":{"columns":{"description":"The mapping in force.","items":{"$ref":"#/components/schemas/ImportColumnMappingSchema"},"title":"Columns","type":"array"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why the whole job failed, if it did.","title":"Error"},"failed_rows":{"description":"Rows that could not be written: the exact count.","title":"Failed Rows","type":"integer"},"id":{"format":"uuid","title":"Id","type":"string"},"imported_rows":{"description":"Rows written so far.","title":"Imported Rows","type":"integer"},"row_errors":{"description":"A capped sample of per-row failures; failed_rows carries the full count.","items":{"$ref":"#/components/schemas/ImportRowErrorSchema"},"title":"Row Errors","type":"array"},"source_filename":{"title":"Source Filename","type":"string"},"status":{"$ref":"#/components/schemas/TableImportStatus"},"table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The table this created; null before commit.","title":"Table Id"},"total_rows":{"description":"Rows this import will write: the file's rows, capped by the plan and by whatever `max_rows` the commit asked for, or the rows its `row_ranges` hold.","title":"Total Rows","type":"integer"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","table_id","status","source_filename","total_rows","imported_rows","failed_rows","error","row_errors","columns","created_at","updated_at"],"title":"TableImportJobResponseSchema","type":"object"},"TableImportPreviewResponseSchema":{"description":"What an upload returns: a mapping to review, and enough of the file to judge it.\n\nNothing is created yet: no table, no columns, no rows. Edit the mapping and\nPOST it to the commit endpoint to actually build the table.\n\nWhen `importable_row_count` is below `estimated_row_count` the file is\nlonger than the plan allows and the import will take its first\n`importable_row_count` rows. Say so before the user commits: the two numbers\nare here as numbers, rather than as a sentence in `warnings`, because the\nclient puts its upgrade control beside them.","properties":{"columns":{"description":"The inferred mapping.","items":{"$ref":"#/components/schemas/ImportPreviewColumnSchema"},"title":"Columns","type":"array"},"estimated_row_count":{"description":"Data rows in the file, excluding the header.","title":"Estimated Row Count","type":"integer"},"import_id":{"description":"Identifies this upload through commit and polling.","format":"uuid","title":"Import Id","type":"string"},"importable_row_count":{"description":"How many of those rows the import will write, once the cap is applied.","title":"Importable Row Count","type":"integer"},"row_limit":{"description":"Rows one table may hold on this organisation's plan.","title":"Row Limit","type":"integer"},"sample_rows":{"description":"Raw sampled rows, in file order.","items":{"items":{"type":"string"},"type":"array"},"title":"Sample Rows","type":"array"},"selected_sheet":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Which sheet these columns were read from. Null for a CSV. POST it to the sheet endpoint to re-read the same upload from a different one.","title":"Selected Sheet"},"sheet_names":{"description":"Every sheet the uploaded workbook offers, in tab order. Empty for a CSV, which has no sheets. That is what says not to offer a sheet picker.","items":{"type":"string"},"title":"Sheet Names","type":"array"},"warnings":{"description":"Non-fatal things the user should see.","items":{"type":"string"},"title":"Warnings","type":"array"}},"required":["import_id","columns","sample_rows","estimated_row_count","importable_row_count","row_limit","warnings"],"title":"TableImportPreviewResponseSchema","type":"object"},"TableImportSheetRequestSchema":{"description":"Which sheet of an already-uploaded workbook to read instead.","properties":{"sheet":{"description":"A sheet name from the preview's `sheet_names`.","maxLength":255,"minLength":1,"title":"Sheet","type":"string"}},"required":["sheet"],"title":"TableImportSheetRequestSchema","type":"object"},"TableImportStatus":{"description":"Where a CSV import has got to.\n\n``PENDING`` is a parsed-and-stored upload the user has not committed yet:\nit holds an inferred mapping and nothing else. ``RUNNING`` means the table\nand its columns exist and the row job is inserting. The two terminal states\nare absorbing: a job never leaves them.","enum":["pending","running","succeeded","failed"],"title":"TableImportStatus","type":"string"},"TableKeywords-Input":{"description":"The most frequent meaningful words in a text or list value.\n\nReads a body of text (a scraped page, a bio, a job description) and\nreturns the words that carry its subject, ordered most frequent first.\nStopwords (\"the\", \"and\", \"with\") are dropped: a frequency count that keeps\nthem returns the same five words for every row and says nothing about any\nof them.\n\nDeterministic and pure: no model call, so a keyword column costs nothing\nand re-runs identically.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"keywords","default":"keywords","title":"Function","type":"string"},"limit":{"default":10,"description":"How many keywords to keep, most frequent first.","maximum":100.0,"minimum":1.0,"title":"Limit","type":"integer"},"min_length":{"default":3,"description":"Shortest word to consider; anything shorter is noise.","maximum":20.0,"minimum":1.0,"title":"Min Length","type":"integer"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableKeywords","type":"object"},"TableKeywords-Output":{"description":"The most frequent meaningful words in a text or list value.\n\nReads a body of text (a scraped page, a bio, a job description) and\nreturns the words that carry its subject, ordered most frequent first.\nStopwords (\"the\", \"and\", \"with\") are dropped: a frequency count that keeps\nthem returns the same five words for every row and says nothing about any\nof them.\n\nDeterministic and pure: no model call, so a keyword column costs nothing\nand re-runs identically.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"keywords","default":"keywords","title":"Function","type":"string"},"limit":{"default":10,"description":"How many keywords to keep, most frequent first.","maximum":100.0,"minimum":1.0,"title":"Limit","type":"integer"},"min_length":{"default":3,"description":"Shortest word to consider; anything shorter is noise.","maximum":20.0,"minimum":1.0,"title":"Min Length","type":"integer"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableKeywords","type":"object"},"TableLastViewSchema":{"description":"The view one person last left one table on, as its address's query string.","properties":{"address":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The table page's query string (view, sort, filter, a view's hidden columns) with no leading '?'; null when they left it as it opens for anyone.","title":"Address"}},"required":["address"],"title":"TableLastViewSchema","type":"object"},"TableLastViewUpdateSchema":{"description":"Request body for keeping, or forgetting, the view a person is leaving a table on.","properties":{"address":{"anyOf":[{"maxLength":16384,"minLength":1,"type":"string"},{"type":"null"}],"description":"The table page's query string (view, sort, filter, a view's hidden columns) with no leading '?'; null when they left it as it opens for anyone. Null forgets it.","title":"Address"}},"required":["address"],"title":"TableLastViewUpdateSchema","type":"object"},"TableLeadSearchRequestSchema":{"description":"The body for appending to an existing table, or editing its saved search.\n\nThe table is the one in the path, so there is no name to give. Enrichments\nare optional here: the destination table is the user's own and may already\ncarry the columns they want.","properties":{"backlinks":{"anyOf":[{"$ref":"#/components/schemas/BacklinksQuerySchema"},{"type":"null"}]},"companies":{"anyOf":[{"$ref":"#/components/schemas/CompanyQuerySchema"},{"type":"null"}]},"enrichments":{"description":"What to find out about the rows this adds. Each becomes its own column, and each is billed per row that comes back with an answer.","items":{"$ref":"#/components/schemas/LeadEnrichmentOption"},"maxItems":4,"title":"Enrichments","type":"array"},"hiring_companies":{"anyOf":[{"$ref":"#/components/schemas/HiringCompaniesQuerySchema"},{"type":"null"}]},"local_businesses":{"anyOf":[{"$ref":"#/components/schemas/LocalBusinessQuerySchema"},{"type":"null"}]},"lookalikes":{"anyOf":[{"$ref":"#/components/schemas/LookalikeQuerySchema"},{"type":"null"}]},"people":{"anyOf":[{"$ref":"#/components/schemas/PeopleQuerySchema"},{"type":"null"}]},"post_authors":{"anyOf":[{"$ref":"#/components/schemas/PostAuthorsQuerySchema"},{"type":"null"}]},"record_type":{"$ref":"#/components/schemas/LeadRecordType"},"row_limit":{"anyOf":[{"maximum":1000000.0,"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Rows to add. Clamped further by the organisation's plan cap; omit for the maximum.","title":"Row Limit"},"search_results":{"anyOf":[{"$ref":"#/components/schemas/SearchResultsQuerySchema"},{"type":"null"}]},"signal_companies":{"anyOf":[{"$ref":"#/components/schemas/SignalCompaniesQuerySchema"},{"type":"null"}]},"signal_people":{"anyOf":[{"$ref":"#/components/schemas/SignalPeopleQuerySchema"},{"type":"null"}]}},"required":["record_type"],"title":"TableLeadSearchRequestSchema","type":"object"},"TableListCount-Input":{"description":"Count the elements of a list value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_count","default":"list_count","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListCount","type":"object"},"TableListCount-Output":{"description":"Count the elements of a list value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_count","default":"list_count","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListCount","type":"object"},"TableListFilter-Input":{"description":"Keep only the list items whose field passes a test.\n\nAn enrichment payload lands as a list of objects (every job opening, every\nfunding round, every contact) and the row usually wants a subset of it:\nthe engineering roles, the rounds after 2024, the contacts with an email.\nWithout this the whole list is the only thing a cell can hold.\n\n``field`` is a dotted path INSIDE each item (``location.country``); leaving\nit empty tests the item itself, which is what a list of plain strings\nneeds. ``exists``/``missing`` ignore ``value``: they ask only whether the\nfield is there.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"field":{"default":"","description":"Dotted path inside each item; empty tests the item itself.","maxLength":200,"title":"Field","type":"string"},"function":{"const":"list_filter","default":"list_filter","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"operator":{"default":"eq","enum":["eq","neq","gt","lt","gte","lte","contains","not_contains","exists","missing"],"title":"Operator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Value"}},"title":"TableListFilter","type":"object"},"TableListFilter-Output":{"description":"Keep only the list items whose field passes a test.\n\nAn enrichment payload lands as a list of objects (every job opening, every\nfunding round, every contact) and the row usually wants a subset of it:\nthe engineering roles, the rounds after 2024, the contacts with an email.\nWithout this the whole list is the only thing a cell can hold.\n\n``field`` is a dotted path INSIDE each item (``location.country``); leaving\nit empty tests the item itself, which is what a list of plain strings\nneeds. ``exists``/``missing`` ignore ``value``: they ask only whether the\nfield is there.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"field":{"default":"","description":"Dotted path inside each item; empty tests the item itself.","maxLength":200,"title":"Field","type":"string"},"function":{"const":"list_filter","default":"list_filter","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"operator":{"default":"eq","enum":["eq","neq","gt","lt","gte","lte","contains","not_contains","exists","missing"],"title":"Operator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"value":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Value"}},"title":"TableListFilter","type":"object"},"TableListFirst-Input":{"description":"Take the first element of a list value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_first","default":"list_first","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListFirst","type":"object"},"TableListFirst-Output":{"description":"Take the first element of a list value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_first","default":"list_first","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListFirst","type":"object"},"TableListIntersect-Input":{"description":"The values this list shares with another: the overlap, in the first list's order.\n\nThe scoring question every ICP fit column asks: which of the buyer's tags,\ntechnologies or keywords are ALSO on my target list. Doing it by hand meant\none ``if_then_else`` per tag.\n\n``other`` is a column holding the second list, or literal text split on\n``separator``. Matching ignores case and surrounding spaces, because the\ntwo lists come from different sources and \"Shopify \" never equals \"shopify\"\nwhen it matters most.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_intersect","default":"list_intersect","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"other":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Other"},"separator":{"default":",","description":"Splits ``other`` when it is text rather than a list.","maxLength":10,"title":"Separator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListIntersect","type":"object"},"TableListIntersect-Output":{"description":"The values this list shares with another: the overlap, in the first list's order.\n\nThe scoring question every ICP fit column asks: which of the buyer's tags,\ntechnologies or keywords are ALSO on my target list. Doing it by hand meant\none ``if_then_else`` per tag.\n\n``other`` is a column holding the second list, or literal text split on\n``separator``. Matching ignores case and surrounding spaces, because the\ntwo lists come from different sources and \"Shopify \" never equals \"shopify\"\nwhen it matters most.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_intersect","default":"list_intersect","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"other":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Other"},"separator":{"default":",","description":"Splits ``other`` when it is text rather than a list.","maxLength":10,"title":"Separator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListIntersect","type":"object"},"TableListJoin-Input":{"description":"Join list elements into a string with a separator.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_join","default":"list_join","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"separator":{"default":", ","title":"Separator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListJoin","type":"object"},"TableListJoin-Output":{"description":"Join list elements into a string with a separator.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_join","default":"list_join","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"separator":{"default":", ","title":"Separator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListJoin","type":"object"},"TableListLast-Input":{"description":"Take the last element of a list value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_last","default":"list_last","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListLast","type":"object"},"TableListLast-Output":{"description":"Take the last element of a list value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_last","default":"list_last","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListLast","type":"object"},"TableListNth-Input":{"description":"Take the element at an index of a list value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_nth","default":"list_nth","title":"Function","type":"string"},"index":{"default":0,"title":"Index","type":"integer"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListNth","type":"object"},"TableListNth-Output":{"description":"Take the element at an index of a list value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_nth","default":"list_nth","title":"Function","type":"string"},"index":{"default":0,"title":"Index","type":"integer"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListNth","type":"object"},"TableListPluck-Input":{"description":"Pull one field out of every object in a list.\n\nEnrichment payloads routinely carry lists of objects\n(``[{\"value\": \"Payroll\"}, {\"value\": \"HR\"}]``) where the useful thing is\nthe field, not the wrapper. Plucking turns that into ``[\"Payroll\", \"HR\"]``\nso ``list_join`` and friends can work on it; items without the field\nbecome empty and scalar items pass through unchanged.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"field":{"minLength":1,"title":"Field","type":"string"},"function":{"const":"list_pluck","default":"list_pluck","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["field"],"title":"TableListPluck","type":"object"},"TableListPluck-Output":{"description":"Pull one field out of every object in a list.\n\nEnrichment payloads routinely carry lists of objects\n(``[{\"value\": \"Payroll\"}, {\"value\": \"HR\"}]``) where the useful thing is\nthe field, not the wrapper. Plucking turns that into ``[\"Payroll\", \"HR\"]``\nso ``list_join`` and friends can work on it; items without the field\nbecome empty and scalar items pass through unchanged.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"field":{"minLength":1,"title":"Field","type":"string"},"function":{"const":"list_pluck","default":"list_pluck","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["field"],"title":"TableListPluck","type":"object"},"TableListSchema":{"description":"A short, non-paginated list of tables (favourites, recents).","properties":{"tables":{"description":"The tables, in the list's own order.","items":{"$ref":"#/components/schemas/TableReadSchema"},"title":"Tables","type":"array"}},"required":["tables"],"title":"TableListSchema","type":"object"},"TableListSort-Input":{"description":"Order a list, ascending or descending.\n\n``list_unique`` and ``list_join`` both preserve whatever order the source\nhappened to arrive in, which is fine until the cell is meant to be READ:\na top-3 of anything, a chronological history, an alphabetised tag list.\n\n``field`` names the dotted path to sort objects BY; empty sorts the items\nthemselves. Values that cannot be compared with each other (a number next\nto a string) are ordered by type first, so the sort is total instead of\nraising on the row where the data is mixed.","properties":{"direction":{"default":"asc","enum":["asc","desc"],"title":"Direction","type":"string"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"field":{"default":"","description":"Dotted path inside each item to sort by; empty sorts the items.","maxLength":200,"title":"Field","type":"string"},"function":{"const":"list_sort","default":"list_sort","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListSort","type":"object"},"TableListSort-Output":{"description":"Order a list, ascending or descending.\n\n``list_unique`` and ``list_join`` both preserve whatever order the source\nhappened to arrive in, which is fine until the cell is meant to be READ:\na top-3 of anything, a chronological history, an alphabetised tag list.\n\n``field`` names the dotted path to sort objects BY; empty sorts the items\nthemselves. Values that cannot be compared with each other (a number next\nto a string) are ordered by type first, so the sort is total instead of\nraising on the row where the data is mixed.","properties":{"direction":{"default":"asc","enum":["asc","desc"],"title":"Direction","type":"string"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"field":{"default":"","description":"Dotted path inside each item to sort by; empty sorts the items.","maxLength":200,"title":"Field","type":"string"},"function":{"const":"list_sort","default":"list_sort","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListSort","type":"object"},"TableListSplit-Input":{"description":"Split a string value into a list on a separator.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_split","default":"list_split","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"separator":{"default":",","title":"Separator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListSplit","type":"object"},"TableListSplit-Output":{"description":"Split a string value into a list on a separator.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_split","default":"list_split","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"separator":{"default":",","title":"Separator","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListSplit","type":"object"},"TableListUnique-Input":{"description":"De-duplicate list elements, keeping first-seen order.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_unique","default":"list_unique","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListUnique","type":"object"},"TableListUnique-Output":{"description":"De-duplicate list elements, keeping first-seen order.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"list_unique","default":"list_unique","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableListUnique","type":"object"},"TableMoveSchema":{"description":"Request body for putting tables in a folder.","properties":{"folder_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder to put them in; null for the top level of the Tables list.","title":"Folder Id"},"table_ids":{"description":"The tables to move.","items":{"format":"uuid","type":"string"},"maxItems":500,"minItems":1,"title":"Table Ids","type":"array"}},"required":["table_ids","folder_id"],"title":"TableMoveSchema","type":"object"},"TableOwnerChangeSchema":{"description":"Request body for naming who owns tables.","properties":{"owner_user_id":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"description":"The workspace member who owns them from now on; null for no owner. Owner means who to ask about a table: it grants and takes away no access, so anyone in the workspace may change it.","title":"Owner User Id"},"table_ids":{"description":"The tables.","items":{"format":"uuid","type":"string"},"maxItems":500,"minItems":1,"title":"Table Ids","type":"array"}},"required":["table_ids","owner_user_id"],"title":"TableOwnerChangeSchema","type":"object"},"TableOwnerChoiceListSchema":{"description":"Everybody a table or folder can be given to.","properties":{"members":{"description":"The members, by name.","items":{"$ref":"#/components/schemas/TableOwnerChoiceSchema"},"title":"Members","type":"array"}},"required":["members"],"title":"TableOwnerChoiceListSchema","type":"object"},"TableOwnerChoiceSchema":{"description":"A workspace member a table or folder can be given to.","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Their email address, to tell two of a name apart.","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Their name, when they have one to show.","title":"Name"},"user_id":{"title":"User Id","type":"string"}},"required":["user_id","name","email"],"title":"TableOwnerChoiceSchema","type":"object"},"TableOwnerCountSchema":{"description":"One owner's tables, counted.","properties":{"owner_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The owner's name, resolved for display; null when there is none to show.","title":"Owner Display Name"},"owner_user_id":{"title":"Owner User Id","type":"string"},"table_count":{"description":"Their tables on the list, archived ones aside.","title":"Table Count","type":"integer"}},"required":["owner_user_id","owner_display_name","table_count"],"title":"TableOwnerCountSchema","type":"object"},"TableOwnerListSchema":{"description":"Who owns the workspace's tables, for the list's owner filter.","properties":{"owners":{"description":"The owners, most tables first.","items":{"$ref":"#/components/schemas/TableOwnerCountSchema"},"title":"Owners","type":"array"},"unowned_count":{"description":"Tables on the list that nobody owns.","title":"Unowned Count","type":"integer"}},"required":["owners","unowned_count"],"title":"TableOwnerListSchema","type":"object"},"TablePhoneE164-Input":{"description":"Normalize a phone number to E.164 format.","properties":{"default_region":{"default":"US","title":"Default Region","type":"string"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"phone_e164","default":"phone_e164","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TablePhoneE164","type":"object"},"TablePhoneE164-Output":{"description":"Normalize a phone number to E.164 format.","properties":{"default_region":{"default":"US","title":"Default Region","type":"string"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"phone_e164","default":"phone_e164","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TablePhoneE164","type":"object"},"TableReadSchema":{"description":"A table definition with its authoritative row counter.","properties":{"ai_made":{"default":false,"description":"Whether the AI Assistant created this table through a granted action. The owner is still the person who approved it.","title":"Ai Made","type":"boolean"},"archived_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When somebody archived it; null for a table on the list. An archived table is left out of All, its folder, Favorites and Recent, and still found by search and opened as before.","title":"Archived At"},"auto_run":{"description":"Whether data changes request recompute runs by themselves. Column-definition changes always recompute.","title":"Auto Run","type":"boolean"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"deleted_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the table was moved to trash; null for a live table.","title":"Deleted At"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"folder_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The folder it sits in; null for the top level.","title":"Folder Id"},"folder_path":{"description":"The folders on the way to it, from the top level down; empty at the top level. What the list says under a search result and the table's own breadcrumb shows.","items":{"$ref":"#/components/schemas/TableFolderCrumbSchema"},"title":"Folder Path","type":"array"},"former_tags":{"description":"The tags it carried when folders replaced tags, when it carried more than one and so waits for somebody to file it. Empty once it is filed.","items":{"type":"string"},"title":"Former Tags","type":"array"},"id":{"format":"uuid","title":"Id","type":"string"},"is_favorite":{"default":false,"description":"Whether the CALLING USER starred this table. Per-user, so a teammate may see a different value. Always false for API-key callers, which have no user to have preferences.","title":"Is Favorite","type":"boolean"},"keep_existing_results":{"description":"Whether a manual run-all only fills the errored, empty and stale cells rather than recomputing every cell in scope.","title":"Keep Existing Results","type":"boolean"},"last_viewed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the calling user last opened this table; null means never.","title":"Last Viewed At"},"name":{"title":"Name","type":"string"},"owner_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The owner's name, resolved for display. Null when there is no owner or the account has no name to show.","title":"Owner Display Name"},"owner_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who created the table. Null for tables older than this field and for anything a background job created. NOT an access control: every member of the organisation can open and edit every table.","title":"Owner User Id"},"row_count":{"description":"Exact row count, maintained atomically by row mutations.","title":"Row Count","type":"integer"},"shared_as_template":{"default":false,"description":"Whether this table's shape is readable by anyone with the link, with no sign-in. Never its rows.","title":"Shared As Template","type":"boolean"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","description","row_count","auto_run","keep_existing_results","created_at","updated_at"],"title":"TableReadSchema","type":"object"},"TableReconnectEventSchema":{"description":"Final frame: the stream reached its maximum age. Reconnect for a fresh one.","properties":{"kind":{"const":"reconnect","default":"reconnect","title":"Kind","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id"],"title":"TableReconnectEventSchema","type":"object"},"TableRegexExtract-Input":{"description":"Extract a regex group from a string value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"regex_extract","default":"regex_extract","title":"Function","type":"string"},"group":{"default":0,"title":"Group","type":"integer"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"pattern":{"title":"Pattern","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["pattern"],"title":"TableRegexExtract","type":"object"},"TableRegexExtract-Output":{"description":"Extract a regex group from a string value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"regex_extract","default":"regex_extract","title":"Function","type":"string"},"group":{"default":0,"title":"Group","type":"integer"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"pattern":{"title":"Pattern","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["pattern"],"title":"TableRegexExtract","type":"object"},"TableRegexReplace-Input":{"description":"Replace regex matches in a string value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"regex_replace","default":"regex_replace","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"pattern":{"title":"Pattern","type":"string"},"replacement":{"title":"Replacement","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["pattern","replacement"],"title":"TableRegexReplace","type":"object"},"TableRegexReplace-Output":{"description":"Replace regex matches in a string value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"regex_replace","default":"regex_replace","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"pattern":{"title":"Pattern","type":"string"},"replacement":{"title":"Replacement","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["pattern","replacement"],"title":"TableRegexReplace","type":"object"},"TableReplace-Input":{"description":"Replace all occurrences of a substring.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"replace","default":"replace","title":"Function","type":"string"},"new":{"title":"New","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"old":{"title":"Old","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["old","new"],"title":"TableReplace","type":"object"},"TableReplace-Output":{"description":"Replace all occurrences of a substring.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"replace","default":"replace","title":"Function","type":"string"},"new":{"title":"New","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"old":{"title":"Old","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["old","new"],"title":"TableReplace","type":"object"},"TableResyncEventSchema":{"description":"Events were lost; refetch everything.\n\nEmitted when this client could not keep up with its queue, or when the\nserver's Valkey link dropped and reconnected. There is no replay log by\ndesign: a refetch is cheaper than maintaining one.","properties":{"kind":{"const":"resync","default":"resync","title":"Kind","type":"string"},"reason":{"title":"Reason","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","reason"],"title":"TableResyncEventSchema","type":"object"},"TableRound-Input":{"description":"Round a numeric value to a precision.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"round","default":"round","title":"Function","type":"string"},"mode":{"default":"round","enum":["round","ceil","floor"],"title":"Mode","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"precision":{"default":0,"title":"Precision","type":"integer"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableRound","type":"object"},"TableRound-Output":{"description":"Round a numeric value to a precision.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"round","default":"round","title":"Function","type":"string"},"mode":{"default":"round","enum":["round","ceil","floor"],"title":"Mode","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"precision":{"default":0,"title":"Precision","type":"integer"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableRound","type":"object"},"TableRoundRobin-Input":{"description":"Assign each row to one of a list of owners, evenly.\n\nLead routing, as a column: the rep, the region, the sending inbox. The\npiped value is the row's IDENTITY (its email, domain or id) and the\nowner is derived from a hash of it rather than from the row's position.\n\nThat is a deliberate departure from a counter-based round robin, and it is\nthe only version that behaves: re-running the column, adding rows above,\nor sorting the view all leave every existing row with the owner it already\nhad. A counter reassigns half the table the first time anything moves,\nwhich in a CRM means the wrong rep gets the follow-up.","properties":{"assignees":{"description":"The owners to distribute across, e.g. rep names or inboxes.","items":{"type":"string"},"maxItems":200,"title":"Assignees","type":"array"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"round_robin","default":"round_robin","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableRoundRobin","type":"object"},"TableRoundRobin-Output":{"description":"Assign each row to one of a list of owners, evenly.\n\nLead routing, as a column: the rep, the region, the sending inbox. The\npiped value is the row's IDENTITY (its email, domain or id) and the\nowner is derived from a hash of it rather than from the row's position.\n\nThat is a deliberate departure from a counter-based round robin, and it is\nthe only version that behaves: re-running the column, adding rows above,\nor sorting the view all leave every existing row with the owner it already\nhad. A counter reassigns half the table the first time anything moves,\nwhich in a CRM means the wrong rep gets the follow-up.","properties":{"assignees":{"description":"The owners to distribute across, e.g. rep names or inboxes.","items":{"type":"string"},"maxItems":200,"title":"Assignees","type":"array"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"round_robin","default":"round_robin","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableRoundRobin","type":"object"},"TableRowDeltaSchema":{"description":"One row's change, as a PARTIAL patch over its cells.\n\n``cells`` carries only the columns this write touched, so a compute page's\nframe is proportional to the columns computed rather than to the table's\nwidth. Clients merge, never replace.\n\nThere is no row-level version and no cleared list. Each cell carries its\nown monotonic watermark, so a delta applies per cell and applying one twice\nor out of order is a no-op; and a cleared cell is PRESENT with a null value\nrather than absent, so a partial map expresses a clear on its own.","properties":{"cells":{"additionalProperties":{"$ref":"#/components/schemas/TableCellDeltaSchema"},"description":"Only the columns this write touched, keyed by str(column_id).","title":"Cells","type":"object"},"record_id":{"format":"uuid","title":"Record Id","type":"string"}},"required":["record_id","cells"],"title":"TableRowDeltaSchema","type":"object"},"TableRowFilterGroupSchema-Input":{"description":"A parenthesised run of conditions, joined among themselves.\n\nHolds conditions and never groups: one level of nesting is expressible and a\nsecond is not, structurally. That covers ``A and (B or C)`` (what a filter\npanel offers) while keeping the SQL a flat walk.","properties":{"conditions":{"description":"The conditions inside the parentheses.","items":{"$ref":"#/components/schemas/TableRowFilterSchema-Input"},"maxItems":8,"minItems":1,"title":"Conditions","type":"array"},"joiner":{"$ref":"#/components/schemas/TableFilterJoiner","default":"and","description":"How this group's conditions combine."},"type":{"const":"group","default":"group","title":"Type","type":"string"}},"required":["conditions"],"title":"TableRowFilterGroupSchema","type":"object"},"TableRowFilterGroupSchema-Output":{"description":"A parenthesised run of conditions, joined among themselves.\n\nHolds conditions and never groups: one level of nesting is expressible and a\nsecond is not, structurally. That covers ``A and (B or C)`` (what a filter\npanel offers) while keeping the SQL a flat walk.","properties":{"conditions":{"description":"The conditions inside the parentheses.","items":{"$ref":"#/components/schemas/TableRowFilterSchema-Output"},"maxItems":8,"minItems":1,"title":"Conditions","type":"array"},"joiner":{"$ref":"#/components/schemas/TableFilterJoiner","default":"and","description":"How this group's conditions combine."},"type":{"const":"group","default":"group","title":"Type","type":"string"}},"required":["conditions"],"title":"TableRowFilterGroupSchema","type":"object"},"TableRowFilterSchema-Input":{"description":"One predicate a row must satisfy.\n\nWhich operators apply depends on the column's type: a range comparison on\na checkbox is rejected rather than silently matching nothing. The valueless\noperators (``is_empty``, ``is_not_empty``, ``is_true``, ``is_false``) must\nnot carry a value.","properties":{"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"$ref":"#/components/schemas/TableRowFilterScope"}],"description":"A column ID, or `__any_column__` to ask about every cell in the row at once. `__any_column__` takes only `has_error` and `has_no_error`.","title":"Column Id"},"operator":{"$ref":"#/components/schemas/TableFilterOperator"},"type":{"const":"condition","default":"condition","title":"Type","type":"string"},"value":{"anyOf":[{"$ref":"#/components/schemas/CellValue-Input"},{"type":"null"}],"description":"The operand; omitted for the valueless operators."}},"required":["column_id","operator"],"title":"TableRowFilterSchema","type":"object"},"TableRowFilterSchema-Output":{"description":"One predicate a row must satisfy.\n\nWhich operators apply depends on the column's type: a range comparison on\na checkbox is rejected rather than silently matching nothing. The valueless\noperators (``is_empty``, ``is_not_empty``, ``is_true``, ``is_false``) must\nnot carry a value.","properties":{"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"$ref":"#/components/schemas/TableRowFilterScope"}],"description":"A column ID, or `__any_column__` to ask about every cell in the row at once. `__any_column__` takes only `has_error` and `has_no_error`.","title":"Column Id"},"operator":{"$ref":"#/components/schemas/TableFilterOperator"},"type":{"const":"condition","default":"condition","title":"Type","type":"string"},"value":{"anyOf":[{"$ref":"#/components/schemas/CellValue-Output"},{"type":"null"}],"description":"The operand; omitted for the valueless operators."}},"required":["column_id","operator"],"title":"TableRowFilterSchema","type":"object"},"TableRowFilterScope":{"description":"The filter targets that name the whole ROW rather than one column.\n\n``ANY_COLUMN`` asks a question of every cell in the row at once: \"does any\ncolumn have an error?\" is the table-wide half of the per-column ``has_error``.\nIt stands in the ``column_id`` slot of an ordinary condition (the same trick\nthe system sort keys use), so a row-wide question travels through every\nsurface that already carries a predicate tree (a saved view, a run's scope,\nan export, a count) with nothing to add to any of them. The dunder spelling\nkeeps it apart from any UUID.","enum":["__any_column__","__record_id__"],"title":"TableRowFilterScope","type":"string"},"TableRowIdsPageSchema":{"description":"One keyset page of a listing's record IDs, in order.","properties":{"has_more":{"title":"Has More","type":"boolean"},"limit":{"title":"Limit","type":"integer"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page; None when this is the last page.","title":"Next Cursor"},"record_ids":{"items":{"format":"uuid","type":"string"},"title":"Record Ids","type":"array"}},"required":["record_ids","next_cursor","has_more","limit"],"title":"TableRowIdsPageSchema","type":"object"},"TableRowIdsQueryRequestSchema":{"description":"Request body for the row-ID manifest.\n\nThe same listing vocabulary as the rows query, minus the projection: this\nasks which rows a listing selects and in what order, not what is in them.\nAnswering it reads no cell payload, so a client can hold a whole table's\nordering cheaply and then hydrate only the window it is showing.","properties":{"cursor":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous page's next_cursor.","title":"Cursor"},"limit":{"default":10000,"description":"Maximum record IDs per page. Far higher than the rows query's limit because a page of IDs carries no cells.","maximum":10000.0,"minimum":1.0,"title":"Limit","type":"integer"},"offset":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"Start the listing this many rows in. Mutually exclusive with `cursor`.","title":"Offset"},"row_status":{"anyOf":[{"$ref":"#/components/schemas/TableRowStatus"},{"type":"null"}],"description":"Restrict to rows whose cells are `errored` or `fully_computed`."},"sorts":{"description":"Order by these columns, in priority order, instead of display order.","items":{"$ref":"#/components/schemas/TableRowSortSchema"},"maxItems":3,"title":"Sorts","type":"array"},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"The predicate tree every returned row must satisfy."}},"title":"TableRowIdsQueryRequestSchema","type":"object"},"TableRowSchema":{"description":"A table row; cells are keyed by the column ID as a string (JSON object keys).\n\nThere is no row-level version or update stamp any more. Freshness is a\nper-cell fact, and the detail panel shows each field's own ``updated_at``.","properties":{"cells":{"additionalProperties":{"$ref":"#/components/schemas/TableCellSchema"},"title":"Cells","type":"object"},"created_at":{"description":"When the row was created.","format":"date-time","title":"Created At","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"}},"required":["record_id","created_at","cells"],"title":"TableRowSchema","type":"object"},"TableRowSearchMatchSchema":{"description":"One matching cell, and where its row sits in the current listing.","properties":{"column_id":{"format":"uuid","title":"Column Id","type":"string"},"record_id":{"format":"uuid","title":"Record Id","type":"string"},"row_offset":{"description":"Zero-based position of the row in the current listing.","title":"Row Offset","type":"integer"}},"required":["record_id","column_id","row_offset"],"title":"TableRowSearchMatchSchema","type":"object"},"TableRowSearchRequestSchema":{"description":"Request body for the in-table search.\n\n``sorts`` and ``where`` are the grid's CURRENT ones, not a second query:\na match's ``row_offset`` only means \"scroll here\" if the server counted the\nsame listing the client is rendering.","properties":{"column_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":500,"type":"array"},{"type":"null"}],"description":"Restrict the search to these columns; omit to search every text column.","title":"Column Ids"},"query":{"description":"The substring to look for; matched case-insensitively.","maxLength":256,"minLength":1,"title":"Query","type":"string"},"sorts":{"description":"The sort the grid is showing, so offsets line up with it.","items":{"$ref":"#/components/schemas/TableRowSortSchema"},"maxItems":3,"title":"Sorts","type":"array"},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"The filters the grid is showing, for the same reason."}},"required":["query"],"title":"TableRowSearchRequestSchema","type":"object"},"TableRowSearchResponseSchema":{"description":"A search's matches, in listing order.","properties":{"limit":{"description":"The cap that was applied.","title":"Limit","type":"integer"},"matches":{"description":"Matching cells, ordered by row offset then column.","items":{"$ref":"#/components/schemas/TableRowSearchMatchSchema"},"title":"Matches","type":"array"},"total_matched":{"description":"Matches found, before the cap.","title":"Total Matched","type":"integer"},"truncated":{"description":"Whether more matches exist than were returned.","title":"Truncated","type":"boolean"}},"required":["matches","total_matched","truncated","limit"],"title":"TableRowSearchResponseSchema","type":"object"},"TableRowSortSchema":{"description":"The column a rows query is ordered by, and which way.","properties":{"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"$ref":"#/components/schemas/TableRowSystemSortKey"}],"description":"A column ID, or `__created_at__` / `__updated_at__` to order by when the row was added or last edited.","title":"Column Id"},"direction":{"$ref":"#/components/schemas/TableSortDirection","default":"asc","description":"Ascending or descending."}},"required":["column_id"],"title":"TableRowSortSchema","type":"object"},"TableRowStatus":{"description":"A row-level state, derived from its cells rather than stored.\n\n``ERRORED`` is \"any cell of this row failed to compute\"; ``FULLY_COMPUTED``\nis its exact complement, so the two partition the table. Serves the built-in\nsmart views, which are questions about computation rather than about values.\nThe ordinary filter vocabulary cannot express either.","enum":["errored","fully_computed"],"title":"TableRowStatus","type":"string"},"TableRowSystemSortKey":{"description":"The sort keys that order by the ROW rather than by one column's cells.\n\n``CREATED_AT`` is when the row was added; ``UPDATED_AT`` is when any of its\ncells last changed (the row was added, for one with no cells). They share\nthe sort slot with column IDs, so a query or a saved view names either the\nsame way; the dunder spelling keeps them apart from any UUID.","enum":["__created_at__","__updated_at__"],"title":"TableRowSystemSortKey","type":"string"},"TableRowWhereItemSchema-Input":{"oneOf":[{"$ref":"#/components/schemas/TableRowFilterSchema-Input"},{"$ref":"#/components/schemas/TableRowFilterGroupSchema-Input"}]},"TableRowWhereItemSchema-Output":{"oneOf":[{"$ref":"#/components/schemas/TableRowFilterSchema-Output"},{"$ref":"#/components/schemas/TableRowFilterGroupSchema-Output"}]},"TableRowsChangedEventSchema":{"description":"One or more rows changed; apply the deltas directly, no refetch needed.","properties":{"kind":{"const":"rows_changed","default":"rows_changed","title":"Kind","type":"string"},"rows":{"items":{"$ref":"#/components/schemas/TableRowDeltaSchema"},"title":"Rows","type":"array"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","rows"],"title":"TableRowsChangedEventSchema","type":"object"},"TableRowsCountRequestSchema":{"description":"Request body for the row count.\n\nThe predicate half of the rows query and nothing else: no cursor, no\nprojection, no sort. Counting is order-independent by definition, and a\ncaller that sends a sort is asking for something this cannot mean.","properties":{"row_status":{"anyOf":[{"$ref":"#/components/schemas/TableRowStatus"},{"type":"null"}],"description":"Restrict to rows whose cells are `errored` or `fully_computed`."},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"The predicate tree rows must satisfy. Omit to count the whole table."}},"title":"TableRowsCountRequestSchema","type":"object"},"TableRowsCountSchema":{"description":"How many rows a predicate selects.","properties":{"count":{"description":"Rows matching the predicate. Exact, not an estimate.","title":"Count","type":"integer"}},"required":["count"],"title":"TableRowsCountSchema","type":"object"},"TableRowsCreateSchema":{"description":"Request body for the row create: how many empty rows, and where.\n\nWithout an anchor, rows are appended to the end of the table. With one,\nexactly one row is inserted directly above or below the anchor row.","properties":{"after_record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Insert a single row directly below this row.","title":"After Record Id"},"before_record_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Insert a single row directly above this row.","title":"Before Record Id"},"count":{"default":1,"description":"Number of empty rows to append to the table.","maximum":1000.0,"minimum":1.0,"title":"Count","type":"integer"}},"title":"TableRowsCreateSchema","type":"object"},"TableRowsCreatedResponseSchema":{"description":"The rows appended by a create, in creation order.","properties":{"count":{"title":"Count","type":"integer"},"rows":{"items":{"$ref":"#/components/schemas/TableRowSchema"},"title":"Rows","type":"array"}},"required":["count","rows"],"title":"TableRowsCreatedResponseSchema","type":"object"},"TableRowsDeleteSchema":{"description":"Request body for the bulk row delete: two scopes, one body.\n\nSend ``record_ids`` to delete a checkbox selection. Send ``all: true`` to\ndelete every row the current listing matches, optionally narrowed by\n``where``/``row_status``, exactly the predicate vocabulary of the rows\nquery, so \"delete everything matching my filters\" and \"show me everything\nmatching my filters\" can never disagree about what matches. The explicit\nflag exists so an accidentally empty body deletes nothing.","properties":{"all":{"default":false,"description":"Delete every matching row rather than a named set. Required (and only honoured) when record_ids is absent.","title":"All","type":"boolean"},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":1000,"minItems":1,"type":"array"},{"type":"null"}],"description":"Record IDs of the rows to delete.","title":"Record Ids"},"row_status":{"anyOf":[{"$ref":"#/components/schemas/TableRowStatus"},{"type":"null"}],"description":"Narrow an `all` delete to errored or fully computed rows."},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"Narrow an `all` delete to rows matching this predicate tree."}},"title":"TableRowsDeleteSchema","type":"object"},"TableRowsDeletedResponseSchema":{"description":"Result of a bulk row delete; missing record IDs are simply absent.\n\nA predicate (`all: true`) delete reports only the count. Echoing ten\nthousand UUIDs would say nothing the count does not.","properties":{"count":{"title":"Count","type":"integer"},"deleted_record_ids":{"default":[],"items":{"format":"uuid","type":"string"},"title":"Deleted Record Ids","type":"array"}},"required":["count"],"title":"TableRowsDeletedResponseSchema","type":"object"},"TableRowsInvalidatedEventSchema":{"description":"The row SET changed (rows created or deleted). Refetch the page.\n\nMembership and ordering changed, and a keyset window cannot be patched\nlocally, so this is deliberately an invalidation rather than a delta.","properties":{"kind":{"const":"rows_invalidated","default":"rows_invalidated","title":"Kind","type":"string"},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"The affected rows when known; null for a whole-table drain or a degraded batch.","title":"Record Ids"},"row_count":{"description":"The table's authoritative row count after the change.","title":"Row Count","type":"integer"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","row_count"],"title":"TableRowsInvalidatedEventSchema","type":"object"},"TableRowsPageSchema":{"description":"One keyset page of table rows.","properties":{"column_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"The columns whose cells this page carries, or null for all of them. A column outside this list is NOT blank. It was simply not fetched.","title":"Column Ids"},"has_more":{"title":"Has More","type":"boolean"},"limit":{"title":"Limit","type":"integer"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page; None when this is the last page.","title":"Next Cursor"},"rows":{"items":{"$ref":"#/components/schemas/TableRowSchema"},"title":"Rows","type":"array"}},"required":["rows","column_ids","next_cursor","has_more","limit"],"title":"TableRowsPageSchema","type":"object"},"TableRowsQueryRequestSchema":{"description":"Request body for the rows query.\n\nA POST rather than a GET because a filter list has no honest query-string\nencoding. ``column_ids`` is the projection: send the columns the grid will\nactually render and the response carries only those cells.","properties":{"column_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":500,"type":"array"},{"type":"null"}],"description":"Project each row's cells to these columns. Omit for every column. The response echoes the projection in `column_ids` so a client can tell a blank cell from one it did not ask for.","title":"Column Ids"},"cursor":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous page's next_cursor.","title":"Cursor"},"limit":{"default":100,"description":"Maximum rows per page.","maximum":100.0,"minimum":1.0,"title":"Limit","type":"integer"},"offset":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"description":"Start the listing this many rows in, rather than at the top: a jump-to-row seek. Mutually exclusive with `cursor`, which resumes a listing rather than starting one. Postgres walks the skipped rows, so use this for a deliberate jump. Keep paging with `next_cursor`.","title":"Offset"},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":1000,"type":"array"},{"type":"null"}],"description":"Hydrate exactly these rows, instead of describing a listing. Mutually exclusive with `sorts`, `where`, `row_status`, `offset` and `cursor`: those select rows, and this names them. Pair with `/rows/ids/` to fetch an ordering once and then fill in row contents a window at a time, which lets re-sorting or re-filtering reuse cells the client already holds.","title":"Record Ids"},"row_status":{"anyOf":[{"$ref":"#/components/schemas/TableRowStatus"},{"type":"null"}],"description":"Restrict to rows whose CELLS are in a given state: `errored` (any cell failed to compute) or `fully_computed` (none did). ANDed with `where`. This is a question about computation, which the filter operators (each of which tests only one column's value) cannot ask."},"sorts":{"description":"Order by these columns, in priority order, instead of the display order. Blanks sort last for every key, whichever way that key runs.","items":{"$ref":"#/components/schemas/TableRowSortSchema"},"maxItems":3,"title":"Sorts","type":"array"},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"The predicate tree every returned row must satisfy. Omit for an unfiltered listing."}},"title":"TableRowsQueryRequestSchema","type":"object"},"TableRowsRunRequestSchema":{"description":"Request body for an on-demand recompute run over rows: two scopes, one body.\n\nSend ``record_ids`` to run a checkbox selection. Send ``all: true`` to run\nevery row the current listing matches, optionally narrowed by ``where`` /\n``row_status``, exactly the predicate vocabulary of the rows query, so\n\"run everything matching my filters\" and \"show me everything matching my\nfilters\" can never disagree about what matches. The explicit flag exists\nso an accidentally empty body runs nothing.","properties":{"all":{"default":false,"description":"Run every matching row rather than a named set. Required (and only honoured) when record_ids is absent. At most `view_scope_max_rows` rows may match; a wider listing is refused with `scope_too_large`.","title":"All","type":"boolean"},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":1000,"minItems":1,"type":"array"},{"type":"null"}],"description":"Record IDs of the rows to recompute.","title":"Record Ids"},"row_status":{"anyOf":[{"$ref":"#/components/schemas/TableRowStatus"},{"type":"null"}],"description":"Narrow an `all` run to errored or fully computed rows."},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"Narrow an `all` run to rows matching this predicate tree."}},"title":"TableRowsRunRequestSchema","type":"object"},"TableRowsRunResponseSchema":{"description":"Result of requesting a row-scoped recompute run.\n\n``run`` is None while the workflow start is still queued. The run row is\nminted post-commit, and the active-runs poll picks it up.","properties":{"request_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The id of this run request. The run is minted with it as its origin, so it is known at once, even while `run` is still null.","title":"Request Id"},"run":{"anyOf":[{"$ref":"#/components/schemas/TableRunReadSchema"},{"type":"null"}]}},"required":["run"],"title":"TableRowsRunResponseSchema","type":"object"},"TableRowsWatermarkSchema":{"description":"The rows watermark: the authoritative row counter.\n\nThere is no cell-write watermark here. Freshness is a per-cell fact now,\nand every cell write is already announced on the change feed as a delta\nthe client applies directly, so a polled max(updated_at) over 100M cell\nrows would buy an index on the hottest table in the schema to answer a\nquestion nothing asks.","properties":{"count":{"description":"Exact row count, maintained atomically by row mutations.","title":"Count","type":"integer"}},"required":["count"],"title":"TableRowsWatermarkSchema","type":"object"},"TableRowsWhereSchema-Input":{"description":"The whole predicate for a rows query.\n\n``items`` mixes conditions with groups under one joiner, so ``A and (B or C)``\nis an AND over ``[A, group(OR, [B, C])]``. Send no ``where`` at all rather\nthan an empty one, so \"no filter\" stays a single state.\n\nThe cap is on LEAVES, not on items: eight conditions cost eight correlated\nEXISTS clauses whether they are grouped or not, and it is the clause count\nthat the query planner pays for.","properties":{"items":{"description":"Conditions and groups.","items":{"$ref":"#/components/schemas/TableRowWhereItemSchema-Input"},"maxItems":8,"minItems":1,"title":"Items","type":"array"},"joiner":{"$ref":"#/components/schemas/TableFilterJoiner","default":"and","description":"How the top-level items combine."}},"required":["items"],"title":"TableRowsWhereSchema","type":"object"},"TableRowsWhereSchema-Output":{"description":"The whole predicate for a rows query.\n\n``items`` mixes conditions with groups under one joiner, so ``A and (B or C)``\nis an AND over ``[A, group(OR, [B, C])]``. Send no ``where`` at all rather\nthan an empty one, so \"no filter\" stays a single state.\n\nThe cap is on LEAVES, not on items: eight conditions cost eight correlated\nEXISTS clauses whether they are grouped or not, and it is the clause count\nthat the query planner pays for.","properties":{"items":{"description":"Conditions and groups.","items":{"$ref":"#/components/schemas/TableRowWhereItemSchema-Output"},"maxItems":8,"minItems":1,"title":"Items","type":"array"},"joiner":{"$ref":"#/components/schemas/TableFilterJoiner","default":"and","description":"How the top-level items combine."}},"required":["items"],"title":"TableRowsWhereSchema","type":"object"},"TableRunChangedEventSchema":{"description":"A recompute run was created, progressed, or reached a terminal status.","properties":{"kind":{"const":"run_changed","default":"run_changed","title":"Kind","type":"string"},"run":{"$ref":"#/components/schemas/TableRunDeltaSchema"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","run"],"title":"TableRunChangedEventSchema","type":"object"},"TableRunDeltaSchema":{"description":"One run's current state; mirrors the REST run schema so clients can drop it straight in.","properties":{"cells_awaiting":{"default":0,"description":"Cells held because an input they read has not been computed yet; not terminal, counted within cells_done.","title":"Cells Awaiting","type":"integer"},"cells_done":{"title":"Cells Done","type":"integer"},"cells_failed":{"title":"Cells Failed","type":"integer"},"cells_no_data":{"default":0,"description":"No-data cells: ran clean but found nothing.","title":"Cells No Data","type":"integer"},"cells_skipped":{"default":0,"description":"Deliberately skipped cells: missing input or false condition.","title":"Cells Skipped","type":"integer"},"cells_total":{"title":"Cells Total","type":"integer"},"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Column Id"},"column_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Every column the run's plan covers, in layer order. Optional so a frame enqueued by an older worker still deserializes; absent means fall back to column_id.","title":"Column Ids"},"completed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Completed At"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"credits_charged":{"default":0,"description":"Credits charged so far. Grows while the run works, as its finished cells are settled every few seconds; final once the run ends.","title":"Credits Charged","type":"number"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"id":{"format":"uuid","title":"Id","type":"string"},"row_scope":{"anyOf":[{"$ref":"#/components/schemas/TableRunRowScopeSchema"},{"type":"null"}],"description":"The rows this run resolved to. Optional so a frame enqueued by an older worker still deserializes mid-rolling-deploy; absent reads as all_rows."},"started_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Started At"},"status":{"title":"Status","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"trigger":{"title":"Trigger","type":"string"}},"required":["id","table_id","trigger","status","cells_total","cells_done","cells_failed","error","created_at","started_at","completed_at"],"title":"TableRunDeltaSchema","type":"object"},"TableRunReadSchema":{"description":"A table recompute run with its static denominator and monotone counters.","properties":{"cells_awaiting":{"description":"Cells the run held because an input they read has not been computed yet. Not a final state: a later run fills them. Counted within cells_done.","title":"Cells Awaiting","type":"integer"},"cells_done":{"description":"Cells processed so far; clamped to cells_total so the banner can never overshoot.","title":"Cells Done","type":"integer"},"cells_failed":{"description":"Cells whose formula evaluation failed.","title":"Cells Failed","type":"integer"},"cells_no_data":{"description":"Cells that ran clean but found nothing. Never retried, and excluded from errored views. Free for a lookup; an AI column's cell is charged what it used. Counted within cells_done.","title":"Cells No Data","type":"integer"},"cells_skipped":{"description":"Cells the run deliberately skipped: a missing required input or a false run condition. Counted within cells_done.","title":"Cells Skipped","type":"integer"},"cells_total":{"description":"Exact static denominator, fixed when the run plan is minted.","title":"Cells Total","type":"integer"},"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The column a column-lineage run recomputes, parsed from its workflow identity; null for whole-table runs. Narrows the grid's busy paint to one column; `row_scope` is what narrows it to the rows within that column.","title":"Column Id"},"column_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Every column this run's plan covers, in dependency (layer) order, not the order they were requested in. Null on runs minted before the plan was published, where column_id is all there is. This is what narrows the grid's busy paint when one run covers several columns, which column_id cannot express.","title":"Column Ids"},"completed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Completed At"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"credits_charged":{"default":0,"description":"Credits charged so far. Grows while the run works, as its finished cells are settled every few seconds; final once the run ends.","title":"Credits Charged","type":"number"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Failure description when the run status is failed.","title":"Error"},"export_retry_attempt":{"default":0,"description":"How many automatic export retries preceded this run. 0 is a run a person or a schedule asked for; higher values mark the follow-ups queued for rows whose push failed for a retryable reason, so a run history can tell 'we tried again' from 'you ran it again'.","title":"Export Retry Attempt","type":"integer"},"id":{"format":"uuid","title":"Id","type":"string"},"row_scope":{"$ref":"#/components/schemas/TableRunRowScopeReadSchema","description":"The rows this run resolved to at mint. Present on every read so a resync cannot lose it and silently fall back to painting the whole column busy."},"started_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Started At"},"status":{"$ref":"#/components/schemas/TableRunStatus","description":"The run's lifecycle status."},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"trigger":{"$ref":"#/components/schemas/TableRunTrigger","description":"What kind of mutation requested the run."}},"required":["id","table_id","trigger","status","cells_total","cells_done","cells_failed","cells_skipped","cells_no_data","cells_awaiting","error","created_at","started_at","completed_at","row_scope"],"title":"TableRunReadSchema","type":"object"},"TableRunRowScopeReadSchema":{"description":"The rows a run resolved to: what lets a client mark exactly those busy.\n\n``record_ids`` is populated for the ``record_ids`` kind alone. ``all_rows``\nand ``unlisted`` both mean \"assume every row\": the first because it is\ntrue, the second because the set was too large to carry on every frame.\nCollapsing them keeps a client's fallback one branch rather than two.","properties":{"kind":{"$ref":"#/components/schemas/TableRunScopeKind","description":"How the resolved row set is published."},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"The exact rows the run will touch; null unless kind is record_ids.","title":"Record Ids"},"rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Rows the resolved scope covers; null for all rows.","title":"Rows"}},"required":["kind","rows","record_ids"],"title":"TableRunRowScopeReadSchema","type":"object"},"TableRunRowScopeSchema":{"description":"The rows a run resolved to, so a reader can mark exactly those cells busy.\n\n``kind`` is a plain string rather than the run domain's enum: this package\nsits under the table stratum and cannot import from it, which is also why\n``trigger`` and ``status`` above are strings. Its values are\n``all_rows`` | ``record_ids`` | ``unlisted``; the first and last both mean\n\"assume every row\".","properties":{"kind":{"title":"Kind","type":"string"},"record_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"The exact rows the run will touch; populated for the record_ids kind only.","title":"Record Ids"},"rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Rows the resolved scope covers; None for all rows.","title":"Rows"}},"required":["kind"],"title":"TableRunRowScopeSchema","type":"object"},"TableRunScope":{"description":"Row scope for an on-demand ``COLUMN_MANUAL`` run.\n\n``CELL`` (a single row, origin-keyed so independent cell re-runs never\nterminate each other) rides the same enum as the column-lineage scopes.\n``UNFILLED`` is \"empty or out-of-date\": errored, stale, valueless and\nnever-computed cells, minus fresh deliberate skips, which would only\nskip again.","enum":["all","errored","unfilled","first_n","cell"],"title":"TableRunScope","type":"string"},"TableRunScopeKind":{"description":"How a minted run's RESOLVED row set is published to readers.\n\nDistinct from :class:`TableRunScope`, which is what the caller ASKED for.\nThe two disagree routinely (``ALL`` on a ``keep_existing_results`` table is\nsilently narrowed to the unfilled rows at mint) and only the resolved set\ncan be painted, so only the resolved set is stored.\n\n``UNLISTED`` is a real row subset whose ids were too many to carry on every\nchangefeed frame (see ``max_persisted_scope_rows``). It reads exactly like\n``ALL_ROWS`` to a client: assume every row. That keeps the fallback one\nbranch rather than two, at the cost of over-painting the rare huge partial.","enum":["all_rows","record_ids","unlisted"],"title":"TableRunScopeKind","type":"string"},"TableRunStatus":{"description":"Lifecycle status of a table run.\n\n``PENDING`` exists for API compatibility but is never observed: runs are\nborn ``RUNNING`` at mint. ``CANCELLING`` is the requested-stop state the\npage activities observe; the workflow finalizes it to ``CANCELLED``.","enum":["pending","running","cancelling","cancelled","paused_for_credits","completed","completed_with_errors","failed"],"title":"TableRunStatus","type":"string"},"TableRunTrigger":{"description":"What kind of mutation requested a recompute run.","enum":["cell_edited","row_added","row_manual","column_added","column_edited","column_manual"],"title":"TableRunTrigger","type":"string"},"TableScheduleFrequency":{"description":"How often a table re-imports, in the vocabulary the settings panel offers.\n\nThe presets are stored as cron because \"the 8th of every month at 09:00\" is\na calendar statement that an interval cannot make: an interval of 30 days\ndrifts off the date within a year. CUSTOM is the escape hatch for \"every N\ndays/weeks/months\", which is an interval and drifts on purpose, anchored to\nwhen the user set it up.\n\nHOURLY is cron too, and it is the one preset that ignores the hour the user\npicked: \"every hour at 09:00\" is not a thing anyone means. The minute is\nkept, so an hourly refresh set at 09:20 runs at twenty past every hour, and\na source that rate-limits is not hit by every table on the hour.","enum":["hourly","daily","weekly","monthly","quarterly","custom"],"title":"TableScheduleFrequency","type":"string"},"TableScheduleIntervalUnit":{"description":"The unit a CUSTOM cadence counts in.\n\nHOURS is the only one with no time of day to honour: \"every 6 hours at\n09:00\" is two statements that cannot both be true. It anchors to the next\noccurrence of the chosen MINUTE instead, the same way the HOURLY preset\nkeeps the minute and drops the hour.","enum":["hours","days","weeks","months"],"title":"TableScheduleIntervalUnit","type":"string"},"TableScheduleSchema":{"description":"A table's refresh cadence.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"delete_missing_rows":{"description":"Whether a scheduled run deletes rows whose records are gone from the source. Forces every scheduled run to re-list everything, since a changes-only fetch cannot tell a deleted record from an unchanged one.","title":"Delete Missing Rows","type":"boolean"},"frequency":{"$ref":"#/components/schemas/TableScheduleFrequency"},"hour":{"description":"Local hour the cadence runs at.","title":"Hour","type":"integer"},"id":{"format":"uuid","title":"Id","type":"string"},"interval_unit":{"anyOf":[{"$ref":"#/components/schemas/TableScheduleIntervalUnit"},{"type":"null"}]},"interval_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How many units apart, for a custom cadence.","title":"Interval Value"},"last_skip_reason":{"anyOf":[{"$ref":"#/components/schemas/TableScheduleSkipReason"},{"type":"null"}],"description":"Why the last firing skipped, alongside last_skipped_at."},"last_skipped_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a firing last skipped without starting a run; null if it never has.","title":"Last Skipped At"},"minute":{"description":"Local minute the cadence runs at.","title":"Minute","type":"integer"},"next_run_at":{"format":"date-time","title":"Next Run At","type":"string"},"next_runs":{"description":"The next few fire times, so a cadence can be checked before it is trusted.","items":{"format":"date-time","type":"string"},"title":"Next Runs","type":"array"},"paused":{"title":"Paused","type":"boolean"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"time_zone":{"description":"IANA zone the run time is expressed in.","title":"Time Zone","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","table_id","frequency","interval_value","interval_unit","time_zone","hour","minute","next_run_at","next_runs","paused","delete_missing_rows","last_skipped_at","last_skip_reason","created_at","updated_at"],"title":"TableScheduleSchema","type":"object"},"TableScheduleSkipReason":{"description":"Why a firing skipped starting an import instead of recording a run.\n\nBoth cases advance ``next_run_at`` the same as a real run does, so without\nthis the schedule just quietly keeps ticking, and a user watching for their\nnightly refresh has nothing to look at but silence.","enum":["source_detached","run_in_progress"],"title":"TableScheduleSkipReason","type":"string"},"TableScoreWords-Input":{"description":"Score text by the weighted words it contains.\n\nThe rules half of lead scoring, without a model: \"enterprise\" is worth 3,\n\"student\" is worth -5, and the cell adds up whatever the row's text,\ntags or tech stack actually say. Expressing the same thing with\n``if_then_else`` needs one step per word and runs out of chain depth at ten.\n\nWeights are a plain object: word or phrase to number. Matching is\ncase-insensitive; a multi-word key matches as a phrase. ``count_repeats``\ndecides whether saying \"enterprise\" three times scores three times, which\nis the difference between weighing a claim and weighing a page.","properties":{"count_repeats":{"default":false,"description":"Score every occurrence rather than once per distinct word.","title":"Count Repeats","type":"boolean"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"score_words","default":"score_words","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"weights":{"additionalProperties":{"type":"number"},"description":"Word or phrase to score, e.g. {'enterprise': 3, 'student': -5}.","title":"Weights","type":"object"}},"title":"TableScoreWords","type":"object"},"TableScoreWords-Output":{"description":"Score text by the weighted words it contains.\n\nThe rules half of lead scoring, without a model: \"enterprise\" is worth 3,\n\"student\" is worth -5, and the cell adds up whatever the row's text,\ntags or tech stack actually say. Expressing the same thing with\n``if_then_else`` needs one step per word and runs out of chain depth at ten.\n\nWeights are a plain object: word or phrase to number. Matching is\ncase-insensitive; a multi-word key matches as a phrase. ``count_repeats``\ndecides whether saying \"enterprise\" three times scores three times, which\nis the difference between weighing a claim and weighing a page.","properties":{"count_repeats":{"default":false,"description":"Score every occurrence rather than once per distinct word.","title":"Count Repeats","type":"boolean"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"score_words","default":"score_words","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"weights":{"additionalProperties":{"type":"number"},"description":"Word or phrase to score, e.g. {'enterprise': 3, 'student': -5}.","title":"Weights","type":"object"}},"title":"TableScoreWords","type":"object"},"TableSortDirection":{"description":"Which way a sorted row listing runs.","enum":["asc","desc"],"title":"TableSortDirection","type":"string"},"TableSourcePreviewRequestSchema":{"description":"What to sample.","properties":{"integration_id":{"description":"The connected integration to sample.","format":"uuid","title":"Integration Id","type":"string"},"record_type":{"description":"Which object to sample.","maxLength":255,"minLength":1,"title":"Record Type","type":"string"}},"required":["integration_id","record_type"],"title":"TableSourcePreviewRequestSchema","type":"object"},"TableSourcePreviewResponseSchema":{"description":"A sample of the records an import would bring in, and the fields inside them.\n\nNothing is created here: no table, no column, no row. Review it, then POST to\nthe create endpoint to build the table.","properties":{"fields":{"description":"Sampled and declared fields.","items":{"$ref":"#/components/schemas/SourceFieldSchema"},"title":"Fields","type":"array"},"identity_field":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The recommended key of the record's ids to match rows on across refreshes: one the tool sets itself where it says which those are. Null means the provider returned nothing usable, and the import cannot proceed.","title":"Identity Field"},"identity_field_choices":{"description":"Every id key rows could be matched on: present on all sampled records, and no two records share a value.","items":{"type":"string"},"title":"Identity Field Choices","type":"array"},"identity_field_options":{"description":"Every id key the sample carries, usable or not, with how many records have it, whether values repeat, and whether people can edit it.","items":{"$ref":"#/components/schemas/IdentityFieldOptionSchema"},"title":"Identity Field Options","type":"array"},"integration_id":{"format":"uuid","title":"Integration Id","type":"string"},"integration_type":{"title":"Integration Type","type":"string"},"record_type":{"title":"Record Type","type":"string"},"sample_records":{"description":"The sampled records themselves.","items":{"additionalProperties":true,"type":"object"},"title":"Sample Records","type":"array"},"suggested_display_paths":{"description":"Fields the create step would give their own column.","items":{"type":"string"},"title":"Suggested Display Paths","type":"array"},"supports_incremental":{"description":"Whether the provider can return only records changed since a given time. When false every refresh re-lists everything.","title":"Supports Incremental","type":"boolean"}},"required":["integration_id","integration_type","record_type","identity_field","identity_field_choices","identity_field_options","fields","sample_records","supports_incremental","suggested_display_paths"],"title":"TableSourcePreviewResponseSchema","type":"object"},"TableSourceRunSchema":{"description":"One import run's progress and outcome.","properties":{"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Classified cause of the failure: unauthorized, rate_limited, server_unavailable, network_error, not_found, pagination_error, bad_request. NULL when the run did not fail.","title":"Error Code"},"finished_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished At"},"id":{"format":"uuid","title":"Id","type":"string"},"identity_field":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The field records were matched on during this run. Null for a run from before this was recorded; read the source's current identity_field instead in that case.","title":"Identity Field"},"is_full_relist":{"description":"Whether this run asked the provider for everything.","title":"Is Full Relist","type":"boolean"},"needs_reconnect":{"default":false,"description":"Whether fixing this means reconnecting the integration. Only true for a credentials failure, so the prompt keeps its meaning.","title":"Needs Reconnect","type":"boolean"},"rows_created":{"title":"Rows Created","type":"integer"},"rows_deleted":{"title":"Rows Deleted","type":"integer"},"rows_skipped":{"description":"Records the run read and left out, broken down by the two counts below. Stopping at the row limit is not a skip; see stopped_at_row_limit.","title":"Rows Skipped","type":"integer"},"rows_skipped_duplicate":{"description":"Of those, records whose match value an earlier, different record in the same page already had; only the first was added.","title":"Rows Skipped Duplicate","type":"integer"},"rows_skipped_no_identity":{"description":"Of those, records that came back with no value for the field rows are matched on, so there was no row for them to be.","title":"Rows Skipped No Identity","type":"integer"},"rows_updated":{"title":"Rows Updated","type":"integer"},"source_id":{"format":"uuid","title":"Source Id","type":"string"},"started_at":{"format":"date-time","title":"Started At","type":"string"},"status":{"$ref":"#/components/schemas/TableSourceRunStatus"},"stopped_at_row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The row limit this run stopped at with records still unread in the tool; null when it read everything it was asked for. Raising the source's row_limit brings the rest in.","title":"Stopped At Row Limit"},"sweep_deletions":{"description":"Whether this run was asked to delete rows whose records are gone from the tool. A run that stopped at a row limit (stopped_at_row_limit) deletes nothing, because it has not read the whole tool.","title":"Sweep Deletions","type":"boolean"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"trigger":{"$ref":"#/components/schemas/TableSourceRunTrigger"}},"required":["id","table_id","source_id","status","trigger","is_full_relist","sweep_deletions","identity_field","rows_created","rows_updated","rows_deleted","rows_skipped","rows_skipped_no_identity","rows_skipped_duplicate","stopped_at_row_limit","error","started_at","finished_at"],"title":"TableSourceRunSchema","type":"object"},"TableSourceRunSkipSchema":{"description":"One record an import run read and left out, and why.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How to find the record in the tool: its name or email, else another of its ids. Null when it carried none.","title":"Label"},"match_value":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For a duplicate, the match value it shares with an earlier record.","title":"Match Value"},"reason":{"$ref":"#/components/schemas/TableSourceSkipReason","description":"Why it was left out: `no_identity` when it came back with no value for the field rows are matched on, `duplicate_in_page` when an earlier, different record in the same page had its match value."}},"required":["id","reason","label","match_value","created_at"],"title":"TableSourceRunSkipSchema","type":"object"},"TableSourceRunStatus":{"description":"Where one import run has got to.\n\nThe terminal states are absorbing: a run never leaves them. There is no\nPENDING here. Unlike a CSV upload, which sits parsed and uncommitted until\nthe user says go, a source run is only ever created at the moment something\ndecides to run it.\n\nCANCELLING is a request, not an outcome. Stopping an import is a database\nstatus flip the workflow observes between pages, never a Temporal terminate:\na terminate could land mid-page and leave rows half-written with nothing to\nsettle the run, which is exactly the stuck state that blocks every future\nrefresh of the table.","enum":["running","cancelling","cancelled","succeeded","failed"],"title":"TableSourceRunStatus","type":"string"},"TableSourceRunTrigger":{"description":"What asked for a run.","enum":["initial","manual","scheduled"],"title":"TableSourceRunTrigger","type":"string"},"TableSourceSchema":{"description":"A table's import source.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"identity_field":{"title":"Identity Field","type":"string"},"integration_id":{"format":"uuid","title":"Integration Id","type":"string"},"integration_type":{"title":"Integration Type","type":"string"},"last_synced_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Start of the last successful run; the incremental watermark.","title":"Last Synced At"},"object_column_id":{"description":"The column each imported record lands in.","format":"uuid","title":"Object Column Id","type":"string"},"record_type":{"title":"Record Type","type":"string"},"record_type_label":{"description":"The object type's name for a person to read ('Contacts', 'Event type').","title":"Record Type Label","type":"string"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Limit"},"supports_incremental":{"title":"Supports Incremental","type":"boolean"},"table_id":{"format":"uuid","title":"Table Id","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","table_id","integration_id","integration_type","record_type","record_type_label","row_limit","object_column_id","identity_field","last_synced_at","supports_incremental","created_at","updated_at"],"title":"TableSourceSchema","type":"object"},"TableSourceSkipReason":{"description":"Why an import read one of the tool's records and left it out of the table.\n\nPer record, and only for records the run actually read. Stopping at the\nrow limit is deliberately NOT one of these: the records past the limit were\nnever read (most tools are asked for exactly the room left), so how many\nthere are is unknowable and which ones is an accident of page size. A run\nrecords THAT it stopped (``stopped_at_row_limit``) instead.\n\n``DUPLICATE`` is a different record carrying a match value an earlier one\nin the same page already has. The provider returning one record twice is\nnot a skip: the record is in the table.","enum":["no_identity","duplicate_in_page"],"title":"TableSourceSkipReason","type":"string"},"TableStatsSchema":{"description":"Aggregate stats for one table, composed from three downward reads.","properties":{"active_run":{"anyOf":[{"$ref":"#/components/schemas/TableRunReadSchema"},{"type":"null"}],"description":"The newest active run, when one exists."},"at_row_cap":{"description":"Whether the table has reached its row cap.","title":"At Row Cap","type":"boolean"},"cell_settlement_by_column":{"additionalProperties":{"$ref":"#/components/schemas/CellSettlementSchema"},"description":"How each column's cells ended, per column ID. A column with no cells is absent; read absence as zero across every figure.\n\nThe completeness read. `filled_cells_by_column` and `failed_cells_by_column` are both projections of this and are kept only so an existing API-key client does not break.","propertyNames":{"format":"uuid"},"title":"Cell Settlement By Column","type":"object"},"columns_by_kind":{"additionalProperties":{"type":"integer"},"description":"Number of columns per column kind (manual/formula).","title":"Columns By Kind","type":"object"},"failed_cells":{"description":"Cells currently carrying an evaluation error.","title":"Failed Cells","type":"integer"},"failed_cells_by_column":{"additionalProperties":{"type":"integer"},"description":"Errored cells per column ID. A column with no failures is absent; read absence as zero. What the column header's error badge shows.","propertyNames":{"format":"uuid"},"title":"Failed Cells By Column","type":"object"},"filled_cells_by_column":{"additionalProperties":{"type":"integer"},"description":"Cells holding a stored value, per column ID. A column with no filled cells is absent; read absence as zero. How much of the column has DATA in it, which is not how much of it is DONE. For that, and for the breakdown behind it, read `cell_settlement_by_column`.","propertyNames":{"format":"uuid"},"title":"Filled Cells By Column","type":"object"},"last_run_at_by_column":{"additionalProperties":{"format":"date-time","type":"string"},"description":"When each column last produced a value. Derived from its newest computed cell. A column absent here has never run. Not the column's updated_at, which moves when it is merely renamed.","propertyNames":{"format":"uuid"},"title":"Last Run At By Column","type":"object"},"row_count":{"title":"Row Count","type":"integer"}},"required":["row_count","columns_by_kind","failed_cells","failed_cells_by_column","filled_cells_by_column","active_run","at_row_cap"],"title":"TableStatsSchema","type":"object"},"TableStatusSchema":{"description":"A point-in-time snapshot: active runs plus the four change watermarks.","properties":{"active_runs":{"description":"Every active (pending/running/cancelling) run, newest first.","items":{"$ref":"#/components/schemas/TableRunReadSchema"},"title":"Active Runs","type":"array"},"columns":{"$ref":"#/components/schemas/TableColumnsWatermarkSchema"},"last_finished_run":{"anyOf":[{"$ref":"#/components/schemas/TableRunReadSchema"},{"type":"null"}],"description":"The newest run that has finished, whatever its outcome. Present so a client can distinguish a table whose last run FAILED from one that is simply idle. Before this, both answered with no runs at all and the footer reported the table up to date moments after a run failed."},"paused_runs":{"description":"Runs most recently stopped because the credit balance ran out mid-run: terminal, but the grid's most important fact until a fresh run supersedes them. Empty when nothing is paused.","items":{"$ref":"#/components/schemas/TableRunReadSchema"},"title":"Paused Runs","type":"array"},"rows":{"$ref":"#/components/schemas/TableRowsWatermarkSchema"},"table_updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"The definition's updated_at. Moves on rename/description edits AND on row-count maintenance (the counter lives on the definition row), so not a rename-only signal. Null only for an unknown table (the no-leak empty status).","title":"Table Updated At"},"ui_prefs":{"$ref":"#/components/schemas/TableUIPrefsWatermarkSchema","description":"Watermark of the team's display preferences: moves on a recolour, or on an API key's hide, pin or resize. A person's own hide, pin or resize is theirs alone and moves nothing here. Deliberately separate from `columns`: a display change must refresh the column list alone, never the rows page and stats that a definition change refreshes."}},"required":["active_runs","rows","columns","ui_prefs","table_updated_at"],"title":"TableStatusSchema","type":"object"},"TableStoppedRunsResponseSchema":{"description":"The runs flipped to cancelling by the global Stop Run action.","properties":{"cancelled_run_ids":{"description":"IDs of the runs flipped to cancelling; empty when nothing was active.","items":{"format":"uuid","type":"string"},"title":"Cancelled Run Ids","type":"array"}},"required":["cancelled_run_ids"],"title":"TableStoppedRunsResponseSchema","type":"object"},"TableTextSimilarity-Input":{"description":"How alike two pieces of text are, as a percentage.\n\nThe dedupe and match question: is \"Acme Inc.\" the same company as \"Acme,\nInc\"? An exact comparison says no and a human says obviously yes, so the\nhonest answer is a number the row can threshold on.\n\nCase and surrounding whitespace never count: they are formatting, not\ndifference. 100 means identical after that normalisation, 0 means nothing\nin common.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"text_similarity","default":"text_similarity","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"other":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Other"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableTextSimilarity","type":"object"},"TableTextSimilarity-Output":{"description":"How alike two pieces of text are, as a percentage.\n\nThe dedupe and match question: is \"Acme Inc.\" the same company as \"Acme,\nInc\"? An exact comparison says no and a human says obviously yes, so the\nhonest answer is a number the row can threshold on.\n\nCase and surrounding whitespace never count: they are formatting, not\ndifference. 100 means identical after that normalisation, 0 means nothing\nin common.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"text_similarity","default":"text_similarity","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"other":{"anyOf":[{"$ref":"#/components/schemas/ColumnRef"},{"$ref":"#/components/schemas/StepRef"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Other"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableTextSimilarity","type":"object"},"TableToBool-Input":{"description":"Coerce the input to a boolean.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_bool","default":"to_bool","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToBool","type":"object"},"TableToBool-Output":{"description":"Coerce the input to a boolean.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_bool","default":"to_bool","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToBool","type":"object"},"TableToDate-Input":{"description":"Coerce the input to a date.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_date","default":"to_date","title":"Function","type":"string"},"input_format":{"default":"auto","enum":["iso","unix","unix_ms","auto"],"title":"Input Format","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToDate","type":"object"},"TableToDate-Output":{"description":"Coerce the input to a date.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_date","default":"to_date","title":"Function","type":"string"},"input_format":{"default":"auto","enum":["iso","unix","unix_ms","auto"],"title":"Input Format","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToDate","type":"object"},"TableToFloat-Input":{"description":"Coerce the input to a float.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_float","default":"to_float","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToFloat","type":"object"},"TableToFloat-Output":{"description":"Coerce the input to a float.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_float","default":"to_float","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToFloat","type":"object"},"TableToInt-Input":{"description":"Coerce the input to an integer.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_int","default":"to_int","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToInt","type":"object"},"TableToInt-Output":{"description":"Coerce the input to an integer.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_int","default":"to_int","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToInt","type":"object"},"TableToString-Input":{"description":"Coerce the input to a string.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_string","default":"to_string","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToString","type":"object"},"TableToString-Output":{"description":"Coerce the input to a string.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"to_string","default":"to_string","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableToString","type":"object"},"TableTrim-Input":{"description":"Strip leading and trailing whitespace from a string value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"trim","default":"trim","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableTrim","type":"object"},"TableTrim-Output":{"description":"Strip leading and trailing whitespace from a string value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"trim","default":"trim","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableTrim","type":"object"},"TableUIPrefsChangedEventSchema":{"description":"Display preferences changed. Refetch the column list ALONE.\n\nSeparate from ``columns_changed`` for the same reason the status watermarks\nare separate: a hide, pin, resize, or recolour must never refetch the rows\npage and stats that a definition change refetches.","properties":{"kind":{"const":"ui_prefs_changed","default":"ui_prefs_changed","title":"Kind","type":"string"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id"],"title":"TableUIPrefsChangedEventSchema","type":"object"},"TableUIPrefsWatermarkSchema":{"description":"The display-preferences change watermark: stored row count plus newest write.","properties":{"count":{"description":"Number of columns with customised display preferences.","title":"Count","type":"integer"},"max_updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Newest updated_at of the team's preferences; null when no column is customised. Moves on a recolour, or an API key's hide, pin or resize (a person's own layout is theirs alone and moves nothing here); resets move `count` and can move this backward. Compare for inequality, never ordering.","title":"Max Updated At"}},"required":["count","max_updated_at"],"title":"TableUIPrefsWatermarkSchema","type":"object"},"TableUpdateSchema":{"description":"Request body for updating a table (tri-state PATCH semantics).","properties":{"auto_run":{"anyOf":[{"type":"boolean"},{}],"description":"Whether data changes (cell edits, new rows) request recompute runs by themselves. Off, formula cells go stale and wait for an explicit run.","title":"Auto Run"},"description":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{},{"type":"null"}],"description":"New description. Set to null to clear.","title":"Description"},"keep_existing_results":{"anyOf":[{"type":"boolean"},{}],"description":"Whether a manual run-all skips cells that already hold a good value, touching only the errored, empty and stale ones. Off re-runs every cell in scope.","title":"Keep Existing Results"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{}],"title":"Name"},"shared_as_template":{"anyOf":[{"type":"boolean"},{}],"description":"Publish this table's SHAPE (its columns, their configuration and what each column holds) to anyone with the link, with no sign-in. Never a row or a cell value. Off by default.","title":"Shared As Template"}},"title":"TableUpdateSchema","type":"object"},"TableUriEncode-Input":{"description":"Percent-encode a value so it survives being put in a URL.\n\nEvery search-URL column builds the same thing (a query string with a\ncompany name in it) and every one of them breaks on the first ampersand\nor accent. Encoding belongs one step before the URL is assembled, not in\na regex chain that handles the four characters someone remembered.\n\n``component`` escapes everything reserved, which is what a query value\nneeds; ``full`` leaves ``:/?#`` alone so an entire URL stays usable.\nLists are encoded item by item.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"uri_encode","default":"uri_encode","title":"Function","type":"string"},"mode":{"default":"component","enum":["component","full"],"title":"Mode","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableUriEncode","type":"object"},"TableUriEncode-Output":{"description":"Percent-encode a value so it survives being put in a URL.\n\nEvery search-URL column builds the same thing (a query string with a\ncompany name in it) and every one of them breaks on the first ampersand\nor accent. Encoding belongs one step before the URL is assembled, not in\na regex chain that handles the four characters someone remembered.\n\n``component`` escapes everything reserved, which is what a query value\nneeds; ``full`` leaves ``:/?#`` alone so an entire URL stays usable.\nLists are encoded item by item.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"uri_encode","default":"uri_encode","title":"Function","type":"string"},"mode":{"default":"component","enum":["component","full"],"title":"Mode","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableUriEncode","type":"object"},"TableUrlDomain-Input":{"description":"Reduce a URL to its bare registrable-looking host.\n\nA website field arrives as a whole URL (``https://www.acme.com/about``)\nbut the thing that joins, dedupes and enriches is ``acme.com``. Doing it\nwith ``regex_extract`` means every caller hand-writes the same fragile\npattern, so the parse lives here once and uses a real URL parser.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"url_domain","default":"url_domain","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableUrlDomain","type":"object"},"TableUrlDomain-Output":{"description":"Reduce a URL to its bare registrable-looking host.\n\nA website field arrives as a whole URL (``https://www.acme.com/about``)\nbut the thing that joins, dedupes and enriches is ``acme.com``. Doing it\nwith ``regex_extract`` means every caller hand-writes the same fragile\npattern, so the parse lives here once and uses a real URL parser.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"url_domain","default":"url_domain","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableUrlDomain","type":"object"},"TableUrlValid-Input":{"description":"Whether a value is a usable web address.\n\nThe gate in front of every scrape, screenshot and HTTP column: a row whose\n\"website\" cell holds \"n/a\", \"coming soon\" or a bare company name should\nnever spend a credit finding that out. True means the value parses as a\nhost with a real-looking domain, not that the site answers. A formula\ncannot make a request, and pretending otherwise would be the one dishonest\nthing this function could do.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"url_valid","default":"url_valid","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"require_scheme":{"default":false,"description":"Demand http:// or https://; off accepts a bare domain.","title":"Require Scheme","type":"boolean"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableUrlValid","type":"object"},"TableUrlValid-Output":{"description":"Whether a value is a usable web address.\n\nThe gate in front of every scrape, screenshot and HTTP column: a row whose\n\"website\" cell holds \"n/a\", \"coming soon\" or a bare company name should\nnever spend a credit finding that out. True means the value parses as a\nhost with a real-looking domain, not that the site answers. A formula\ncannot make a request, and pretending otherwise would be the one dishonest\nthing this function could do.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"url_valid","default":"url_valid","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"require_scheme":{"default":false,"description":"Demand http:// or https://; off accepts a bare domain.","title":"Require Scheme","type":"boolean"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"title":"TableUrlValid","type":"object"},"TableUserPrefsReadSchema":{"description":"One user's relationship with one table.\n\nPer-USER: two people in the same organisation are meant to disagree about\nwhat they have starred.","properties":{"is_favorite":{"description":"Whether this user starred the table.","title":"Is Favorite","type":"boolean"},"last_viewed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this user last opened the table; null means never.","title":"Last Viewed At"}},"required":["is_favorite","last_viewed_at"],"title":"TableUserPrefsReadSchema","type":"object"},"TableUtmParse-Input":{"description":"Extract a UTM parameter from a URL value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"utm_parse","default":"utm_parse","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"parameter":{"enum":["source","medium","campaign","term","content"],"title":"Parameter","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["parameter"],"title":"TableUtmParse","type":"object"},"TableUtmParse-Output":{"description":"Extract a UTM parameter from a URL value.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"utm_parse","default":"utm_parse","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"parameter":{"enum":["source","medium","campaign","term","content"],"title":"Parameter","type":"string"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["parameter"],"title":"TableUtmParse","type":"object"},"TableValueMapping-Input":{"description":"Map input values through a lookup table.","properties":{"default_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Default Value"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"value_mapping","default":"value_mapping","title":"Function","type":"string"},"mapping":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"title":"Mapping","type":"object"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["mapping"],"title":"TableValueMapping","type":"object"},"TableValueMapping-Output":{"description":"Map input values through a lookup table.","properties":{"default_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Default Value"},"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"value_mapping","default":"value_mapping","title":"Function","type":"string"},"mapping":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"title":"Mapping","type":"object"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"}},"required":["mapping"],"title":"TableValueMapping","type":"object"},"TableViewCreateSchema":{"description":"Request body for creating a saved view.","properties":{"description":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{"type":"null"}],"title":"Description"},"hidden_column_ids":{"description":"Columns the view hides.","items":{"format":"uuid","type":"string"},"maxItems":500,"title":"Hidden Column Ids","type":"array"},"is_default":{"default":false,"description":"Make this the table's default view: the one a link naming no view opens on, for a person with no last view of the table. Stands down whichever view held it; at most one view per table carries it.","title":"Is Default","type":"boolean"},"name":{"description":"View name, unique per table.","maxLength":255,"minLength":1,"title":"Name","type":"string"},"position":{"default":0,"description":"Display position in the view switcher; ties break by name.","minimum":0.0,"title":"Position","type":"integer"},"sorts":{"description":"Order rows by these columns, in priority order.","items":{"$ref":"#/components/schemas/TableRowSortSchema"},"maxItems":3,"title":"Sorts","type":"array"},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"Predicate tree rows must satisfy while the view is applied."}},"required":["name"],"title":"TableViewCreateSchema","type":"object"},"TableViewListResponseSchema":{"description":"All saved views of one table, in position-then-name order.","properties":{"total_count":{"title":"Total Count","type":"integer"},"views":{"items":{"$ref":"#/components/schemas/TableViewReadSchema"},"title":"Views","type":"array"}},"required":["views","total_count"],"title":"TableViewListResponseSchema","type":"object"},"TableViewReadSchema":{"description":"A saved view: named sort/filter/hidden-column overrides for one table.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"hidden_column_ids":{"description":"Columns the view hides.","items":{"format":"uuid","type":"string"},"title":"Hidden Column Ids","type":"array"},"id":{"format":"uuid","title":"Id","type":"string"},"is_default":{"description":"Whether opening the table with no view named applies this one, for a person with no last view of the table. At most one view per table carries it.","title":"Is Default","type":"boolean"},"name":{"title":"Name","type":"string"},"position":{"description":"Display position in the view switcher; ties break by name.","title":"Position","type":"integer"},"sorts":{"description":"The view's sort keys, in priority order.","items":{"$ref":"#/components/schemas/TableRowSortSchema"},"title":"Sorts","type":"array"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Output"},{"type":"null"}],"description":"Predicate tree rows must satisfy while the view is applied."}},"required":["id","name","description","position","is_default","sorts","where","hidden_column_ids","created_at","updated_at"],"title":"TableViewReadSchema","type":"object"},"TableViewSequenceImpactListSchema":{"description":"Every unfinished sequence that reads its contacts through the view, by id.","properties":{"sequences":{"items":{"$ref":"#/components/schemas/TableViewSequenceImpactSchema"},"title":"Sequences","type":"array"}},"required":["sequences"],"title":"TableViewSequenceImpactListSchema","type":"object"},"TableViewSequenceImpactRequestSchema":{"description":"The filter a view would be saved with, to count what it does to its sequences.","properties":{"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{"type":"null"}],"description":"The filter as it would be saved. Null for no filter."}},"title":"TableViewSequenceImpactRequestSchema","type":"object"},"TableViewSequenceImpactSchema":{"description":"What saving the filter does to one sequence that reads its contacts through the view.","properties":{"capped":{"description":"The view matches more rows than the counts read; added is at least this. Removed and not changed are exact.","title":"Capped","type":"boolean"},"diff":{"anyOf":[{"$ref":"#/components/schemas/AudienceDiffReadSchema"},{"type":"null"}]},"follows_table":{"description":"The sequence keeps in sync with the table. A fixed list ignores a filter edited here, so it has no diff.","title":"Follows Table","type":"boolean"},"name":{"title":"Name","type":"string"},"sequence_id":{"format":"uuid","title":"Sequence Id","type":"string"},"status":{"$ref":"#/components/schemas/SequenceStatus"}},"required":["sequence_id","name","status","follows_table","diff","capped"],"title":"TableViewSequenceImpactSchema","type":"object"},"TableViewUpdateSchema":{"description":"Request body for updating a saved view (tri-state PATCH semantics).","properties":{"description":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{},{"type":"null"}],"description":"New description. Set to null to clear.","title":"Description"},"hidden_column_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":500,"type":"array"},{}],"title":"Hidden Column Ids"},"is_default":{"anyOf":[{"type":"boolean"},{}],"description":"True makes this the table's default view (the one a link naming no view opens on, for a person with no last view of the table), standing down whichever view held it. False clears the flag, leaving the table with no default.","title":"Is Default"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{}],"title":"Name"},"position":{"anyOf":[{"minimum":0.0,"type":"integer"},{}],"title":"Position"},"sorts":{"anyOf":[{"items":{"$ref":"#/components/schemas/TableRowSortSchema"},"maxItems":3,"type":"array"},{}],"description":"New sort keys, in priority order. Empty restores display order.","title":"Sorts"},"where":{"anyOf":[{"$ref":"#/components/schemas/TableRowsWhereSchema-Input"},{},{"type":"null"}],"title":"Where"}},"title":"TableViewUpdateSchema","type":"object"},"TableWeightedRoundRobin-Input":{"description":"Assign each row to an owner, in proportion to each owner's share.\n\nThe version real teams need: a senior rep takes three leads for every one\na new hire gets, one region absorbs twice the volume of another. Shares are\nwhole numbers and mean exactly what they look like: 3 and 1 is three\nquarters and one quarter.\n\nStable per row for the same reason ``round_robin`` is: the owner comes from\na hash of the row's identity, so nothing already assigned moves when the\ntable grows or the view is sorted. Changing the SHARES does move rows,\nbecause that is what changing them means.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"weighted_round_robin","default":"weighted_round_robin","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Input","change_case":"#/components/schemas/TableChangeCase-Input","clamp":"#/components/schemas/TableClamp-Input","coalesce":"#/components/schemas/TableCoalesce-Input","company_domain":"#/components/schemas/TableCompanyDomain-Input","concatenate":"#/components/schemas/TableConcatenate-Input","conditions":"#/components/schemas/TableConditions-Input","copy":"#/components/schemas/TableCopy-Input","date_arithmetic":"#/components/schemas/TableDateArithmetic-Input","date_diff":"#/components/schemas/TableDateDiff-Input","date_extract":"#/components/schemas/TableDateExtract-Input","date_format":"#/components/schemas/TableDateFormat-Input","detect_language":"#/components/schemas/TableDetectLanguage-Input","email_permutations":"#/components/schemas/TableEmailPermutations-Input","format":"#/components/schemas/TableFormat-Input","get_path":"#/components/schemas/TableGetPath-Input","hash":"#/components/schemas/TableHash-Input","if_then_else":"#/components/schemas/TableIfThenElse-Input","keywords":"#/components/schemas/TableKeywords-Input","list_count":"#/components/schemas/TableListCount-Input","list_filter":"#/components/schemas/TableListFilter-Input","list_first":"#/components/schemas/TableListFirst-Input","list_intersect":"#/components/schemas/TableListIntersect-Input","list_join":"#/components/schemas/TableListJoin-Input","list_last":"#/components/schemas/TableListLast-Input","list_nth":"#/components/schemas/TableListNth-Input","list_pluck":"#/components/schemas/TableListPluck-Input","list_sort":"#/components/schemas/TableListSort-Input","list_split":"#/components/schemas/TableListSplit-Input","list_unique":"#/components/schemas/TableListUnique-Input","phone_e164":"#/components/schemas/TablePhoneE164-Input","regex_extract":"#/components/schemas/TableRegexExtract-Input","regex_replace":"#/components/schemas/TableRegexReplace-Input","replace":"#/components/schemas/TableReplace-Input","round":"#/components/schemas/TableRound-Input","round_robin":"#/components/schemas/TableRoundRobin-Input","score_words":"#/components/schemas/TableScoreWords-Input","text_similarity":"#/components/schemas/TableTextSimilarity-Input","to_bool":"#/components/schemas/TableToBool-Input","to_date":"#/components/schemas/TableToDate-Input","to_float":"#/components/schemas/TableToFloat-Input","to_int":"#/components/schemas/TableToInt-Input","to_string":"#/components/schemas/TableToString-Input","trim":"#/components/schemas/TableTrim-Input","uri_encode":"#/components/schemas/TableUriEncode-Input","url_domain":"#/components/schemas/TableUrlDomain-Input","url_valid":"#/components/schemas/TableUrlValid-Input","utm_parse":"#/components/schemas/TableUtmParse-Input","value_mapping":"#/components/schemas/TableValueMapping-Input","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Input"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Input"},{"$ref":"#/components/schemas/TableChangeCase-Input"},{"$ref":"#/components/schemas/TableTrim-Input"},{"$ref":"#/components/schemas/TableReplace-Input"},{"$ref":"#/components/schemas/TableRegexExtract-Input"},{"$ref":"#/components/schemas/TableRegexReplace-Input"},{"$ref":"#/components/schemas/TableConcatenate-Input"},{"$ref":"#/components/schemas/TableArithmetic-Input"},{"$ref":"#/components/schemas/TableRound-Input"},{"$ref":"#/components/schemas/TableClamp-Input"},{"$ref":"#/components/schemas/TableDateFormat-Input"},{"$ref":"#/components/schemas/TableDateExtract-Input"},{"$ref":"#/components/schemas/TableDateArithmetic-Input"},{"$ref":"#/components/schemas/TableListFirst-Input"},{"$ref":"#/components/schemas/TableListLast-Input"},{"$ref":"#/components/schemas/TableListNth-Input"},{"$ref":"#/components/schemas/TableListJoin-Input"},{"$ref":"#/components/schemas/TableListCount-Input"},{"$ref":"#/components/schemas/TableListPluck-Input"},{"$ref":"#/components/schemas/TableListUnique-Input"},{"$ref":"#/components/schemas/TableListSplit-Input"},{"$ref":"#/components/schemas/TableCoalesce-Input"},{"$ref":"#/components/schemas/TableIfThenElse-Input"},{"$ref":"#/components/schemas/TableConditions-Input"},{"$ref":"#/components/schemas/TableValueMapping-Input"},{"$ref":"#/components/schemas/TableToString-Input"},{"$ref":"#/components/schemas/TableToInt-Input"},{"$ref":"#/components/schemas/TableToFloat-Input"},{"$ref":"#/components/schemas/TableToBool-Input"},{"$ref":"#/components/schemas/TableToDate-Input"},{"$ref":"#/components/schemas/TablePhoneE164-Input"},{"$ref":"#/components/schemas/TableUtmParse-Input"},{"$ref":"#/components/schemas/TableUrlDomain-Input"},{"$ref":"#/components/schemas/TableCompanyDomain-Input"},{"$ref":"#/components/schemas/TableGetPath-Input"},{"$ref":"#/components/schemas/TableFormat-Input"},{"$ref":"#/components/schemas/TableDateDiff-Input"},{"$ref":"#/components/schemas/TableKeywords-Input"},{"$ref":"#/components/schemas/TableListFilter-Input"},{"$ref":"#/components/schemas/TableListSort-Input"},{"$ref":"#/components/schemas/TableListIntersect-Input"},{"$ref":"#/components/schemas/TableTextSimilarity-Input"},{"$ref":"#/components/schemas/TableDetectLanguage-Input"},{"$ref":"#/components/schemas/TableScoreWords-Input"},{"$ref":"#/components/schemas/TableHash-Input"},{"$ref":"#/components/schemas/TableUriEncode-Input"},{"$ref":"#/components/schemas/TableUrlValid-Input"},{"$ref":"#/components/schemas/TableEmailPermutations-Input"},{"$ref":"#/components/schemas/TableRoundRobin-Input"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Input"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"weights":{"additionalProperties":{"type":"integer"},"description":"Owner to share, e.g. {'ada': 3, 'grace': 1}.","title":"Weights","type":"object"}},"title":"TableWeightedRoundRobin","type":"object"},"TableWeightedRoundRobin-Output":{"description":"Assign each row to an owner, in proportion to each owner's share.\n\nThe version real teams need: a senior rep takes three leads for every one\na new hire gets, one region absorbs twice the volume of another. Shares are\nwhole numbers and mean exactly what they look like: 3 and 1 is three\nquarters and one quarter.\n\nStable per row for the same reason ``round_robin`` is: the owner comes from\na hash of the row's identity, so nothing already assigned moves when the\ntable grows or the view is sorted. Changing the SHARES does move rows,\nbecause that is what changing them means.","properties":{"failure_mode":{"$ref":"#/components/schemas/TableFailureMode","default":"set_null"},"fallback_value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Fallback Value"},"function":{"const":"weighted_round_robin","default":"weighted_round_robin","title":"Function","type":"string"},"next":{"anyOf":[{"discriminator":{"mapping":{"arithmetic":"#/components/schemas/TableArithmetic-Output","change_case":"#/components/schemas/TableChangeCase-Output","clamp":"#/components/schemas/TableClamp-Output","coalesce":"#/components/schemas/TableCoalesce-Output","company_domain":"#/components/schemas/TableCompanyDomain-Output","concatenate":"#/components/schemas/TableConcatenate-Output","conditions":"#/components/schemas/TableConditions-Output","copy":"#/components/schemas/TableCopy-Output","date_arithmetic":"#/components/schemas/TableDateArithmetic-Output","date_diff":"#/components/schemas/TableDateDiff-Output","date_extract":"#/components/schemas/TableDateExtract-Output","date_format":"#/components/schemas/TableDateFormat-Output","detect_language":"#/components/schemas/TableDetectLanguage-Output","email_permutations":"#/components/schemas/TableEmailPermutations-Output","format":"#/components/schemas/TableFormat-Output","get_path":"#/components/schemas/TableGetPath-Output","hash":"#/components/schemas/TableHash-Output","if_then_else":"#/components/schemas/TableIfThenElse-Output","keywords":"#/components/schemas/TableKeywords-Output","list_count":"#/components/schemas/TableListCount-Output","list_filter":"#/components/schemas/TableListFilter-Output","list_first":"#/components/schemas/TableListFirst-Output","list_intersect":"#/components/schemas/TableListIntersect-Output","list_join":"#/components/schemas/TableListJoin-Output","list_last":"#/components/schemas/TableListLast-Output","list_nth":"#/components/schemas/TableListNth-Output","list_pluck":"#/components/schemas/TableListPluck-Output","list_sort":"#/components/schemas/TableListSort-Output","list_split":"#/components/schemas/TableListSplit-Output","list_unique":"#/components/schemas/TableListUnique-Output","phone_e164":"#/components/schemas/TablePhoneE164-Output","regex_extract":"#/components/schemas/TableRegexExtract-Output","regex_replace":"#/components/schemas/TableRegexReplace-Output","replace":"#/components/schemas/TableReplace-Output","round":"#/components/schemas/TableRound-Output","round_robin":"#/components/schemas/TableRoundRobin-Output","score_words":"#/components/schemas/TableScoreWords-Output","text_similarity":"#/components/schemas/TableTextSimilarity-Output","to_bool":"#/components/schemas/TableToBool-Output","to_date":"#/components/schemas/TableToDate-Output","to_float":"#/components/schemas/TableToFloat-Output","to_int":"#/components/schemas/TableToInt-Output","to_string":"#/components/schemas/TableToString-Output","trim":"#/components/schemas/TableTrim-Output","uri_encode":"#/components/schemas/TableUriEncode-Output","url_domain":"#/components/schemas/TableUrlDomain-Output","url_valid":"#/components/schemas/TableUrlValid-Output","utm_parse":"#/components/schemas/TableUtmParse-Output","value_mapping":"#/components/schemas/TableValueMapping-Output","weighted_round_robin":"#/components/schemas/TableWeightedRoundRobin-Output"},"propertyName":"function"},"oneOf":[{"$ref":"#/components/schemas/TableCopy-Output"},{"$ref":"#/components/schemas/TableChangeCase-Output"},{"$ref":"#/components/schemas/TableTrim-Output"},{"$ref":"#/components/schemas/TableReplace-Output"},{"$ref":"#/components/schemas/TableRegexExtract-Output"},{"$ref":"#/components/schemas/TableRegexReplace-Output"},{"$ref":"#/components/schemas/TableConcatenate-Output"},{"$ref":"#/components/schemas/TableArithmetic-Output"},{"$ref":"#/components/schemas/TableRound-Output"},{"$ref":"#/components/schemas/TableClamp-Output"},{"$ref":"#/components/schemas/TableDateFormat-Output"},{"$ref":"#/components/schemas/TableDateExtract-Output"},{"$ref":"#/components/schemas/TableDateArithmetic-Output"},{"$ref":"#/components/schemas/TableListFirst-Output"},{"$ref":"#/components/schemas/TableListLast-Output"},{"$ref":"#/components/schemas/TableListNth-Output"},{"$ref":"#/components/schemas/TableListJoin-Output"},{"$ref":"#/components/schemas/TableListCount-Output"},{"$ref":"#/components/schemas/TableListPluck-Output"},{"$ref":"#/components/schemas/TableListUnique-Output"},{"$ref":"#/components/schemas/TableListSplit-Output"},{"$ref":"#/components/schemas/TableCoalesce-Output"},{"$ref":"#/components/schemas/TableIfThenElse-Output"},{"$ref":"#/components/schemas/TableConditions-Output"},{"$ref":"#/components/schemas/TableValueMapping-Output"},{"$ref":"#/components/schemas/TableToString-Output"},{"$ref":"#/components/schemas/TableToInt-Output"},{"$ref":"#/components/schemas/TableToFloat-Output"},{"$ref":"#/components/schemas/TableToBool-Output"},{"$ref":"#/components/schemas/TableToDate-Output"},{"$ref":"#/components/schemas/TablePhoneE164-Output"},{"$ref":"#/components/schemas/TableUtmParse-Output"},{"$ref":"#/components/schemas/TableUrlDomain-Output"},{"$ref":"#/components/schemas/TableCompanyDomain-Output"},{"$ref":"#/components/schemas/TableGetPath-Output"},{"$ref":"#/components/schemas/TableFormat-Output"},{"$ref":"#/components/schemas/TableDateDiff-Output"},{"$ref":"#/components/schemas/TableKeywords-Output"},{"$ref":"#/components/schemas/TableListFilter-Output"},{"$ref":"#/components/schemas/TableListSort-Output"},{"$ref":"#/components/schemas/TableListIntersect-Output"},{"$ref":"#/components/schemas/TableTextSimilarity-Output"},{"$ref":"#/components/schemas/TableDetectLanguage-Output"},{"$ref":"#/components/schemas/TableScoreWords-Output"},{"$ref":"#/components/schemas/TableHash-Output"},{"$ref":"#/components/schemas/TableUriEncode-Output"},{"$ref":"#/components/schemas/TableUrlValid-Output"},{"$ref":"#/components/schemas/TableEmailPermutations-Output"},{"$ref":"#/components/schemas/TableRoundRobin-Output"},{"$ref":"#/components/schemas/TableWeightedRoundRobin-Output"}]},{"type":"null"}],"title":"Next"},"source_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Column Id"},"source_step":{"anyOf":[{"minimum":1.0,"type":"integer"},{"type":"null"}],"description":"Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.","title":"Source Step"},"weights":{"additionalProperties":{"type":"integer"},"description":"Owner to share, e.g. {'ada': 3, 'grace': 1}.","title":"Weights","type":"object"}},"title":"TableWeightedRoundRobin","type":"object"},"TablesChangedSchema":{"description":"Which tables a move, owner change or archive actually changed.","properties":{"table_ids":{"description":"The tables changed. One already as asked, missing or in Trash is left out.","items":{"format":"uuid","type":"string"},"title":"Table Ids","type":"array"}},"required":["table_ids"],"title":"TablesChangedSchema","type":"object"},"TaskChannel":{"description":"Which channel performs the task once it is allowed to run.","enum":["linkedin","email"],"title":"TaskChannel","type":"string"},"TaskProgressState":{"description":"Where a task's work stands once the queue has let it go, for the Tasks page's Detail column.\n\nFiner than ``TaskStatus``, and read from the channel rather than the row:\na LinkedIn step's own phase and outcome first (the task's status can lag\nit), the contact's enrolment for an email.\n\n``QUEUED`` in its sender's line, with a forecast, or approved and about to\njoin it; ``RUNNING`` in a browser now; ``SENDING`` an approved email the\nengine is sending; ``HELD`` an approved email waiting for the sending\nwindow, pacing or a daily cap, or an approved LinkedIn step waiting for\nsomething its contact names (a connected account); ``PAUSED`` an approved\nstep on either channel that waits for its paused sequence or paused\ncontact to be resumed, in no line until then. ``WRITING`` a task Write\nagain withdrew while the agent writes its contact's words for that step\nagain, or the engine is about to ask with them: the same task comes back\nwaiting on a person. The rest are how it ended: ``SENT``, ``SKIPPED`` (not\napplicable, or passed over in the extension), ``FAILED``, ``REJECTED`` and\n``STOPPED`` (the contact was stopped under it, or it was replaced and the\nrewrite ended without asking again).","enum":["queued","running","sent","skipped","failed","stopped","rejected","sending","held","paused","writing"],"title":"TaskProgressState","type":"string"},"TaskStatus":{"description":"Where one task stands.\n\nPENDING is waiting on a person. SCHEDULED is approved, or never needed\napproval, and is waiting on the channel to execute it: the browser to run\nthe LinkedIn step, the engine to send the email. The task is where a\nLinkedIn step's approval lives: while it is PENDING no step exists, and\nthe step is queued only once it is SCHEDULED. A LinkedIn task nobody is\nasked about (a sender on automatic, a housekeeping read, a Try click) is\nBORN scheduled, pointing at the step it queued. Who approved it is a stamp\non the row, not a status of its own.\n\nDONE, REJECTED and CANCELLED are terminal. DONE is the channel executed\nit; REJECTED is a person refused it; CANCELLED is the channel gave up on\nit (failed, skipped, expired), or the contact was stopped underneath it.","enum":["pending","scheduled","done","rejected","cancelled"],"title":"TaskStatus","type":"string"},"TeamHeadcountFilterSchema":{"description":"How many of a company's employees sit in one team, as a min/max band.","properties":{"gte":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Gte"},"lte":{"anyOf":[{"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Lte"},"team":{"default":"","description":"The department or seniority to count, spelled the way the people search spells it: Sales, Engineering and Technical, Director.","maxLength":200,"title":"Team","type":"string"}},"title":"TeamHeadcountFilterSchema","type":"object"},"TemplateScope":{"description":"Which composer a template belongs to.\n\nA scope, not a folder: the picker filters to the surface it was opened\nfrom (with an everything view), and save-as-template stamps the surface\nit was saved from, so the library can't drift into a junk drawer.","enum":["sequence_step","linkedin","inbox_reply"],"title":"TemplateScope","type":"string"},"TemplateSegmentSchema":{"properties":{"builtin":{"anyOf":[{"$ref":"#/components/schemas/BuiltinVariable"},{"type":"null"}]},"column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Column Id"},"kind":{"$ref":"#/components/schemas/SegmentKind"},"options":{"description":"Spintax alternatives; one is chosen per contact.","items":{"type":"string"},"maxItems":20,"title":"Options","type":"array"},"required":{"default":true,"title":"Required","type":"boolean"},"text":{"default":"","title":"Text","type":"string"}},"required":["kind"],"title":"TemplateSegmentSchema","type":"object"},"TestSendRequestSchema":{"properties":{"mailbox_id":{"format":"uuid","title":"Mailbox Id","type":"string"},"record_id":{"description":"The contact the variables render against.","format":"uuid","title":"Record Id","type":"string"},"to_address":{"maxLength":320,"minLength":3,"title":"To Address","type":"string"}},"required":["mailbox_id","to_address","record_id"],"title":"TestSendRequestSchema","type":"object"},"TestSendResponseSchema":{"properties":{"provider_message_id":{"title":"Provider Message Id","type":"string"}},"required":["provider_message_id"],"title":"TestSendResponseSchema","type":"object"},"TextFilterSchema":{"description":"Include and/or exclude a set of values for one text attribute.","properties":{"exclude":{"items":{"type":"string"},"maxItems":200,"title":"Exclude","type":"array"},"include":{"items":{"type":"string"},"maxItems":200,"title":"Include","type":"array"}},"title":"TextFilterSchema","type":"object"},"ThreadDoneUpdateSchema":{"description":"Whether the conversation is done.","properties":{"done":{"description":"True marks it done now; false clears the mark.","title":"Done","type":"boolean"}},"required":["done"],"title":"ThreadDoneUpdateSchema","type":"object"},"ThreadLabelsPutSchema":{"properties":{"label_ids":{"items":{"format":"uuid","type":"string"},"maxItems":50,"title":"Label Ids","type":"array"}},"required":["label_ids"],"title":"ThreadLabelsPutSchema","type":"object"},"ThreadListReadSchema":{"properties":{"threads":{"items":{"$ref":"#/components/schemas/ThreadReadSchema"},"title":"Threads","type":"array"},"total":{"title":"Total","type":"integer"}},"required":["threads","total"],"title":"ThreadListReadSchema","type":"object"},"ThreadOrigin":{"description":"Which store a thread lives in.\n\nONE MEMBER, on purpose. There were four assistants and four transcript\ntables; three were retired and there is one assistant now. The enum stays\nrather than collapsing to nothing, because `origin` is still half of how\na meta row names a thread and is still on the wire, and because a second\nstore arriving is a change to this list rather than to every signature\nthat carries it.\n\n``table``, ``find_leads`` and ``agent`` were the other three. Their rows\nare deleted by a release task in the same release that drops their\ntables: every read here coerces the column back into this enum, so a row\nnaming a member that no longer exists raises rather than being skipped.","enum":["chat"],"title":"ThreadOrigin","type":"string"},"ThreadReadFlagUpdateSchema":{"properties":{"read":{"title":"Read","type":"boolean"}},"required":["read"],"title":"ThreadReadFlagUpdateSchema","type":"object"},"ThreadReadSchema":{"properties":{"came_back":{"description":"Back in the Inbox because our answer went three business days unanswered: `returns_at` has passed.","title":"Came Back","type":"boolean"},"can_reply_on_linkedin":{"default":false,"description":"Whether an explicit channel='linkedin' reply can go out on this thread, because it carries a LinkedIn member identity and a paired account. The composer's channel toggle keys off this.","title":"Can Reply On Linkedin","type":"boolean"},"channel":{"$ref":"#/components/schemas/InboxChannel"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"contact_key":{"title":"Contact Key","type":"string"},"contact_linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The contact's LinkedIn profile URL, when our own evidence (invitation ledger, dispatched actions, or the sequence's mapped column) names one. Only the SINGLE-thread read resolves it; the list leaves it null.","title":"Contact Linkedin Url"},"contact_name":{"title":"Contact Name","type":"string"},"contact_replied":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the contact has written back in this thread: a person's reply, never an auto-reply, a bounce or a robot's acknowledgement. False on a send nobody answered, which the working views never list. Only the thread LIST populates it; single-thread reads leave it null.","title":"Contact Replied"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"done_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a person marked the conversation done. `is_done` says whether the mark still holds.","title":"Done At"},"enrolment_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The contact's enrolment in this thread's sequence, when it has one: the id the 'Resume cadence' action targets.","title":"Enrolment Id"},"follow_up_expected":{"description":"Whether an answer of ours they leave unanswered would come back to the Inbox: the contact has written, and the verdict on their latest reply, by the classifier or a label a person set, does not say the conversation is over.","title":"Follow Up Expected","type":"boolean"},"has_pending_draft":{"default":false,"description":"An AI reply is waiting for approval on this thread: the list row's 'Action required' mark. Only the thread LIST populates it; single-thread reads leave it False and the open conversation fetches the draft itself.","title":"Has Pending Draft","type":"boolean"},"id":{"format":"uuid","title":"Id","type":"string"},"is_bounce":{"title":"Is Bounce","type":"boolean"},"is_done":{"description":"Marked done, and no new message has reached us since: out of the Inbox. Their reply, or an answer of ours, arriving after the mark ends it, whatever time the message gives itself; an auto-reply, a bounce, a forward or a reply still waiting on Tasks does not.","title":"Is Done","type":"boolean"},"is_out_of_office":{"title":"Is Out Of Office","type":"boolean"},"is_unread":{"title":"Is Unread","type":"boolean"},"label_ids":{"items":{"format":"uuid","type":"string"},"title":"Label Ids","type":"array"},"last_message_at":{"format":"date-time","title":"Last Message At","type":"string"},"last_snippet":{"title":"Last Snippet","type":"string"},"linkedin_account_status":{"anyOf":[{"$ref":"#/components/schemas/LinkedInAccountStatus"},{"type":"null"}],"description":"The pairing state of the LinkedIn account this thread replies from. Anything but 'active' blocks queueing a LinkedIn reply: 'revoked' was disconnected and 'pending' never bound a member. Only the SINGLE-thread read resolves it; the list leaves it null, as does a thread with no LinkedIn account or one whose account row is gone."},"linkedin_checkpoint_status":{"anyOf":[{"$ref":"#/components/schemas/LinkedInCheckpointStatus"},{"type":"null"}],"description":"Whether LinkedIn is currently challenging that account. Single-thread read only; the list leaves it null."},"linkedin_last_seen_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When a browser on that account last checked in; null when none ever has. Single-thread read only; the list leaves it null.","title":"Linkedin Last Seen At"},"linkedin_presence":{"anyOf":[{"$ref":"#/components/schemas/LinkedInPresence"},{"type":"null"}],"description":"How recently a browser on that account checked in: active, idle or not seen. Carried beside the status rather than blanked for a non-active account (the senders list does that), because the composer shows the two as separate facts. Single-thread read only; the list leaves it null."},"linkedin_queue_expiry_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Always null. The wait window was retired: a queued LinkedIn reply now waits for a person, or for a browser, without expiring. The field stays so older clients still find it; a null hides the composer's sentence about it.","title":"Linkedin Queue Expiry Days"},"linkedin_sender_profile_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The sender the LinkedIn account belongs to, so the composer can send a person to that sender's LinkedIn tab to reconnect. Single-thread read only; the list leaves it null.","title":"Linkedin Sender Profile Id"},"listed_at":{"description":"The moment the list sorts this conversation by: its last message, or later when a reminder went off or, on the Inbox's own views, when it came back from silence. The time to show beside the row.","format":"date-time","title":"Listed At","type":"string"},"mailbox_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Mailbox Id"},"match_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The matched message, headlined around the match. Only set when searching.","title":"Match Excerpt"},"message_count":{"title":"Message Count","type":"integer"},"returns_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this conversation comes back to the Inbox if the contact stays quiet: three business days after our latest answer, at the same time of day, counted in the sender's timezone. In the past once it has come back (`came_back`). Null when it will not: they have the last word, the verdict on their latest reply, by the classifier or a label a person set, says the conversation is over (Negative, Meeting booked, Meeting completed, Closed or Wrong contact), or it is done.","title":"Returns At"},"sequence_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sequence Id"},"snoozed_until":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Hidden from the working views until this instant.","title":"Snoozed Until"},"step_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Step Id"},"stop_reason":{"anyOf":[{"$ref":"#/components/schemas/StopReason"},{"type":"null"}],"description":"Set when the cadence is stopped (reply, unsubscribe, bounce, ...). None for a live or normally-completed enrolment. Only 'reply' is resumable."},"subject":{"title":"Subject","type":"string"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","contact_email","contact_key","channel","contact_name","mailbox_id","sequence_id","step_id","subject","last_message_at","last_snippet","is_unread","is_out_of_office","is_bounce","message_count","label_ids","created_at","updated_at","is_done","came_back","follow_up_expected","listed_at"],"title":"ThreadReadSchema","type":"object"},"ThreadSnoozeSchema":{"description":"When to resurface the thread; null cancels the snooze.","properties":{"snoozed_until":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Snoozed Until"}},"required":["snoozed_until"],"title":"ThreadSnoozeSchema","type":"object"},"ThreadSort":{"description":"The order a working inbox is read in.\n\nNEWEST is the default and what every mail client does. LONGEST_WAITING is\nthe one a sales team actually triages by: a reply that came in on Monday and\nstill has no answer on Thursday is the most expensive thing in the list, and\nnewest-first buries it under everything that has arrived since. Smartlead\nbuilds its whole SLA view on this ordering, and we had no way to reach it:\nthe list was newest-first with no alternative.\n\nDeliberately two named READINGS rather than a generic field+direction pair.\n\"Longest waiting\" is not `last_message_at asc`: an expired snooze lifts a\nthread to its wake-up time, so both orderings sort the same\ncomputed instant, and exposing the raw column would let a caller ask for an\norder that disagrees with the one the list actually uses.","enum":["newest","longest_waiting","positives_first","sequence"],"title":"ThreadSort","type":"string"},"TimezoneSource":{"description":"Where a sender's timezone came from, which decides what may replace it.\n\n``GUESSED``: from whoever created the sender, or from the sequences it\nalready sent for. ``BROWSER``: reported by the browser driving the\nsender's LinkedIn, which fills a sender that had none. ``PERSON``: chosen\non the Senders page or through the AI Assistant. Since 2026-10-09 nothing\ndetected moves a zone a sender has, whatever its source: only a person\ndoes, and a zone a person clears is filled again by detection.","enum":["guessed","browser","person"],"title":"TimezoneSource","type":"string"},"ToolListResponseSchema":{"description":"Every operation the AI Assistant can call.","properties":{"tools":{"items":{"$ref":"#/components/schemas/ToolReadSchema"},"title":"Tools","type":"array"}},"required":["tools"],"title":"ToolListResponseSchema","type":"object"},"ToolReadSchema":{"description":"One tool the AI Assistant can use, as the settings page and the trail name it.\n\nOne list, two readers. The settings page groups the writes into switches a\nworkspace can allow without asking. The chat's trail turns a step into a\nsentence a person can read: before this, a step showed the raw operation\nname and a turn's work read \"get ai context, find tools, list tables\".","properties":{"action_label":{"description":"The action it takes, verb first: \"Add a column\". What the settings page names a permission by, and the words its approval card is titled with.","title":"Action Label","type":"string"},"area":{"description":"The part of the product it belongs to, for grouping.","title":"Area","type":"string"},"conditional_write":{"default":false,"description":"Whether it is not declared a write, yet some calls to it change the workspace: a buying-signal search adds rows only once it names a table. Such a call asks first unless this operation itself is allowed: a permission of its own, which no `family:<area>` grant covers. The settings page lists it with a switch of its own.","title":"Conditional Write","type":"boolean"},"description":{"description":"What it does, in full.","title":"Description","type":"string"},"destructive":{"default":false,"description":"Whether calling it removes something. Always asks a person, whatever is granted, and its card is drawn and read differently.","title":"Destructive","type":"boolean"},"grantable":{"description":"Whether a workspace may allow this to run without asking. False for the ones that may never be granted, which the settings page must not offer as a switch.","title":"Grantable","type":"boolean"},"label":{"description":"What it did, past tense: \"Searched for people\".","title":"Label","type":"string"},"name":{"description":"The tool's name, and the grant's key.","title":"Name","type":"string"},"parent":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For an extended tool, the built-in through which the assistant finds it, usually its family's listing tool. None for a built-in.","title":"Parent"},"running_label":{"description":"What it is doing, while it does it: \"Searching for people\".","title":"Running Label","type":"string"},"tier":{"$ref":"#/components/schemas/ToolTier","default":"builtin","description":"Whether the assistant is offered this on every call (built-in) or only once a conversation has looked it up by name (extended). A budget, not a permission: an extended tool runs and is granted exactly like a built-in one."},"write":{"description":"Whether calling it changes the workspace.","title":"Write","type":"boolean"}},"required":["name","label","running_label","action_label","description","area","write","grantable"],"title":"ToolReadSchema","type":"object"},"ToolTier":{"enum":["builtin","extended"],"type":"string"},"TrainingApproveRequestSchema":{"description":"The proposal the reviewer actually read, echoed back.","properties":{"proposed_prompt":{"description":"The proposed prompt as displayed. A proposal replaced meanwhile is rejected rather than approved unseen.","maxLength":20000,"minLength":1,"title":"Proposed Prompt","type":"string"}},"required":["proposed_prompt"],"title":"TrainingApproveRequestSchema","type":"object"},"TrainingFeedbackHistorySchema":{"description":"One earlier cycle's verdict on the same row.","properties":{"cycle":{"title":"Cycle","type":"integer"},"feedback":{"title":"Feedback","type":"string"},"verdict":{"$ref":"#/components/schemas/TrainingVerdict"}},"required":["cycle","verdict","feedback"],"title":"TrainingFeedbackHistorySchema","type":"object"},"TrainingFeedbackUpdateSchema":{"description":"One row's verdict, and the note a bad verdict has to carry.","properties":{"feedback":{"default":"","description":"What was wrong and how to change it. Required when the verdict is bad.","maxLength":4000,"title":"Feedback","type":"string"},"verdict":{"anyOf":[{"$ref":"#/components/schemas/TrainingVerdict"},{"type":"null"}],"description":"The reviewer's call on this row. Null withdraws it: an empty note no longer clears anything, because a good row is recorded without one."}},"title":"TrainingFeedbackUpdateSchema","type":"object"},"TrainingManualSourceSchema":{"description":"Training inputs typed by hand, one dict of input values per row.","properties":{"kind":{"const":"manual","default":"manual","title":"Kind","type":"string"},"rows":{"description":"One set of input values per training row, in display order.","items":{"additionalProperties":{"maxLength":8000,"type":"string"},"propertyNames":{"maxLength":100,"minLength":1},"type":"object"},"maxItems":25,"minItems":1,"title":"Rows","type":"array"}},"required":["rows"],"title":"TrainingManualSourceSchema","type":"object"},"TrainingProgressSchema":{"description":"How far the current cycle's run has got.","properties":{"done":{"title":"Done","type":"integer"},"failed":{"title":"Failed","type":"integer"},"total":{"title":"Total","type":"integer"}},"required":["total","done","failed"],"title":"TrainingProgressSchema","type":"object"},"TrainingProposalSchema":{"description":"A pending prompt revision, alongside what it would replace.","properties":{"changed":{"description":"False when the model proposed no change at all.","title":"Changed","type":"boolean"},"current_prompt":{"title":"Current Prompt","type":"string"},"proposed_prompt":{"title":"Proposed Prompt","type":"string"},"review":{"anyOf":[{"$ref":"#/components/schemas/ProposalReviewDTO"},{"type":"null"}]},"stale":{"default":false,"description":"True when the agent's prompt changed after this proposal was written, so approving it would be refused. The only signal to warn on: current_prompt is always the live prompt.","title":"Stale","type":"boolean"}},"required":["current_prompt","proposed_prompt","changed"],"title":"TrainingProposalSchema","type":"object"},"TrainingProposeRequestSchema":{"description":"A request for a revised prompt, optionally critiquing a prior proposal.","properties":{"revision_request":{"default":"","description":"What to change about the proposal already on screen.","maxLength":2000,"title":"Revision Request","type":"string"}},"title":"TrainingProposeRequestSchema","type":"object"},"TrainingRowReadSchema":{"description":"One training row: its fixed inputs and the current cycle's result.\n\n``verdict`` is this cycle's call on the row, null until the reviewer makes\none, which is what lets a reloaded page show the rows already judged.\n``feedback`` is the note behind a bad verdict (empty otherwise), and\n``prior_feedback`` carries the earlier cycles' verdicts so the reviewer can\nsee what they already asked for before asking again.","properties":{"changed_fields":{"description":"Names of the output fields whose answer meaningfully differs from `previous_value`. Compared by what each field holds, so an agent rewording the same paragraph does not count. Empty when nothing moved, and on a row with nothing to compare against.","items":{"type":"string"},"title":"Changed Fields","type":"array"},"confidence":{"anyOf":[{"$ref":"#/components/schemas/AgentConfidence"},{"type":"null"}]},"credits_charged":{"title":"Credits Charged","type":"number"},"cycle":{"title":"Cycle","type":"integer"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_class":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentErrorClass"},{"type":"null"}]},"feedback":{"title":"Feedback","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"inputs":{"additionalProperties":{"type":"string"},"title":"Inputs","type":"object"},"outcome":{"anyOf":[{"$ref":"#/components/schemas/EnrichmentCellOutcome"},{"type":"null"}]},"position":{"title":"Position","type":"integer"},"previous_value":{"description":"The output that earlier verdict was reacting to, so the reviewer can be shown what the prompt revision moved.","title":"Previous Value"},"previous_verdict":{"anyOf":[{"$ref":"#/components/schemas/TrainingVerdict"},{"type":"null"}],"description":"The verdict this row carried the last time it was judged, on an earlier cycle. Null on the first cycle and on a row never judged."},"prior_feedback":{"items":{"$ref":"#/components/schemas/TrainingFeedbackHistorySchema"},"title":"Prior Feedback","type":"array"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"skipped_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skipped Reason"},"sources":{"items":{"type":"string"},"title":"Sources","type":"array"},"status":{"$ref":"#/components/schemas/TrainingRowStatus"},"steps":{"items":{"$ref":"#/components/schemas/TrainingStepSchema"},"title":"Steps","type":"array"},"value":{"description":"The produced value, on success.","title":"Value"},"verdict":{"anyOf":[{"$ref":"#/components/schemas/TrainingVerdict"},{"type":"null"}]}},"required":["id","position","inputs","cycle","status","outcome","error","error_class","skipped_reason","confidence","reasoning","steps","sources","credits_charged","verdict","feedback","prior_feedback"],"title":"TrainingRowReadSchema","type":"object"},"TrainingRowStatus":{"description":"How far one training row has got in the CURRENT cycle's run.\n\n``DONE`` means the run settled, not that it succeeded. A row whose agent\ncall failed is still done, and its ``outcome`` says what happened. The\nreviewer critiques failures too.","enum":["pending","running","done"],"title":"TrainingRowStatus","type":"string"},"TrainingSessionCreateSchema":{"description":"Where a new training session takes its inputs from.","properties":{"source":{"discriminator":{"mapping":{"manual":"#/components/schemas/TrainingManualSourceSchema","table":"#/components/schemas/TrainingTableSourceSchema"},"propertyName":"kind"},"oneOf":[{"$ref":"#/components/schemas/TrainingTableSourceSchema"},{"$ref":"#/components/schemas/TrainingManualSourceSchema"}],"title":"Source"}},"required":["source"],"title":"TrainingSessionCreateSchema","type":"object"},"TrainingSessionReadSchema":{"description":"A whole training session, as the reviewer's page polls it.\n\nEverything the page needs in one payload: the phase (``status``), the\ncycle, the rows with their results and critiques, and the pending proposal\nwhen there is one.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"cycle":{"title":"Cycle","type":"integer"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"id":{"format":"uuid","title":"Id","type":"string"},"progress":{"$ref":"#/components/schemas/TrainingProgressSchema"},"proposal":{"anyOf":[{"$ref":"#/components/schemas/TrainingProposalSchema"},{"type":"null"}]},"rows":{"items":{"$ref":"#/components/schemas/TrainingRowReadSchema"},"title":"Rows","type":"array"},"saved_agent_id":{"format":"uuid","title":"Saved Agent Id","type":"string"},"source_input_mappings":{"additionalProperties":{"type":"string"},"title":"Source Input Mappings","type":"object"},"source_kind":{"$ref":"#/components/schemas/TrainingSourceKind"},"source_table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Source Table Id"},"status":{"$ref":"#/components/schemas/TrainingSessionStatus"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","saved_agent_id","status","cycle","source_kind","source_table_id","source_input_mappings","error","created_at","updated_at","progress","rows","proposal"],"title":"TrainingSessionReadSchema","type":"object"},"TrainingSessionStatus":{"description":"Where a training session stands: the state the reviewer's screen shows.\n\nOne enum rather than a separate lifecycle flag and phase, because the\nphase IS the state: a session is either waiting on the machine\n(``RUNNING``), waiting on the reviewer (``REVIEWING``, ``PROPOSED``), or\nfinished. Callers never derive the screen from row counts.","enum":["running","reviewing","proposed","completed","abandoned"],"title":"TrainingSessionStatus","type":"string"},"TrainingSourceKind":{"description":"Where a session's training inputs came from.","enum":["table","manual"],"title":"TrainingSourceKind","type":"string"},"TrainingStepSchema":{"description":"One research step the agent took on a training row.","properties":{"action":{"$ref":"#/components/schemas/AgentStepAction"},"detail":{"title":"Detail","type":"string"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How long the step took; null on records that predate timing.","title":"Duration Ms"},"observation":{"title":"Observation","type":"string"},"outcome":{"$ref":"#/components/schemas/AgentStepOutcome","default":"completed","description":"How the step ended, so a failed or refused step reads as one."},"thought":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The model's stated reasoning for this step; null when not recorded.","title":"Thought"}},"required":["action","detail","observation"],"title":"TrainingStepSchema","type":"object"},"TrainingTablePreviewRequestSchema":{"description":"The table binding to show real rows for, before a session starts.","properties":{"input_mappings":{"additionalProperties":{"format":"uuid","type":"string"},"description":"Agent input name -> the column its value is read from.","maxProperties":20,"propertyNames":{"maxLength":100,"minLength":1},"title":"Input Mappings","type":"object"},"row_count":{"default":3,"description":"How many rows to show.","maximum":25.0,"minimum":1.0,"title":"Row Count","type":"integer"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","input_mappings"],"title":"TrainingTablePreviewRequestSchema","type":"object"},"TrainingTablePreviewResponseSchema":{"description":"The first rows a table source would feed the agent.","properties":{"empty_inputs":{"description":"Inputs whose mapped column is blank in every previewed row. The agent would run without them, which is the expensive mistake this preview exists to make visible.","items":{"type":"string"},"title":"Empty Inputs","type":"array"},"rows":{"description":"One set of input values per row, in table order.","items":{"additionalProperties":{"maxLength":8000,"type":"string"},"propertyNames":{"maxLength":100,"minLength":1},"type":"object"},"title":"Rows","type":"array"}},"required":["rows","empty_inputs"],"title":"TrainingTablePreviewResponseSchema","type":"object"},"TrainingTableSourceSchema":{"description":"Training inputs read from a table, one row per record.","properties":{"input_mappings":{"additionalProperties":{"format":"uuid","type":"string"},"description":"Agent input name -> the column its value is read from.","maxProperties":20,"propertyNames":{"maxLength":100,"minLength":1},"title":"Input Mappings","type":"object"},"kind":{"const":"table","default":"table","title":"Kind","type":"string"},"row_count":{"default":10,"description":"How many of the table's rows to train on.","maximum":25.0,"minimum":1.0,"title":"Row Count","type":"integer"},"table_id":{"format":"uuid","title":"Table Id","type":"string"}},"required":["table_id","input_mappings"],"title":"TrainingTableSourceSchema","type":"object"},"TrainingVerdict":{"description":"The reviewer's call on one row's output.\n\nKept as its own enum rather than reusing the cells' ``up``/``down`` thumbs:\na training verdict is a judgement on a worked example, and the two domains\nare deliberately independent of each other.\n\n``BAD`` always carries a note, because a complaint with no explanation gives the\nprompt rewrite nothing to act on. ``GOOD`` never does: it says the output\nwas right, and the rewrite is told to preserve whatever produced it.","enum":["good","bad"],"title":"TrainingVerdict","type":"string"},"TransactionsResponseSchema":{"description":"Response schema for the organization's invoice history.","properties":{"invoices":{"description":"The invoices, newest first.","items":{"$ref":"#/components/schemas/InvoiceReadSchema"},"title":"Invoices","type":"array"}},"required":["invoices"],"title":"TransactionsResponseSchema","type":"object"},"TrashedSequenceReadSchema":{"description":"A sequence in Trash, as the Trash page lists it.","properties":{"audience_table_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The table its status and messages columns stay on while it is in Trash.","title":"Audience Table Id"},"audience_table_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"That table's name; None when it has none, or the table is in Trash too.","title":"Audience Table Name"},"contacts":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The contacts it had, from the workspace's cached list stats; None while they have not been built.","title":"Contacts"},"deleted_at":{"description":"When it went to Trash. It is deleted for good once it has been there as long as Trash keeps anything (30 days).","format":"date-time","title":"Deleted At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"status":{"$ref":"#/components/schemas/SequenceStatus","description":"As it went to Trash: a launched one was paused, and comes back paused. A draft comes back a draft."}},"required":["id","name","status","deleted_at"],"title":"TrashedSequenceReadSchema","type":"object"},"TrashedTableFolderListSchema":{"description":"The folders in Trash, newest deletion first.","properties":{"folders":{"items":{"$ref":"#/components/schemas/TrashedTableFolderSchema"},"title":"Folders","type":"array"}},"required":["folders"],"title":"TrashedTableFolderListSchema","type":"object"},"TrashedTableFolderSchema":{"description":"A folder in Trash, with the tables that went with it.","properties":{"deleted_at":{"format":"date-time","title":"Deleted At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"table_count":{"description":"Tables that went to Trash with it, and come back with it.","title":"Table Count","type":"integer"}},"required":["id","name","deleted_at","table_count"],"title":"TrashedTableFolderSchema","type":"object"},"UnauthorizedResponse":{"properties":{"detail":{"description":"The detail of why the request is unauthorized.","title":"Detail","type":"string"}},"required":["detail"],"title":"UnauthorizedResponse","type":"object"},"UnavailableLeadEnrichmentSchema":{"description":"An enrichment that applies to this search but cannot run right now.","properties":{"display_name":{"title":"Display Name","type":"string"},"key":{"$ref":"#/components/schemas/LeadEnrichmentOption"}},"required":["key","display_name"],"title":"UnavailableLeadEnrichmentSchema","type":"object"},"UnmatchedCompanySchema":{"description":"One company of the column that no one in the people search works at.","properties":{"company":{"description":"The company as the column holds it: its website or page.","title":"Company","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The company's name from the same row, read from the table's column of company names when it has one; null otherwise.","title":"Name"},"suggestion":{"anyOf":[{"$ref":"#/components/schemas/CompanyNameSuggestionSchema"},{"type":"null"}],"description":"A company of the same name the people search has people at: a sign the column holds another website than the one people list. Null when there is none, or the name is shared by too many companies."}},"required":["company","name","suggestion"],"title":"UnmatchedCompanySchema","type":"object"},"UnprocessableEntityIssue":{"properties":{"input":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"items":{},"type":"array"},{"additionalProperties":true,"type":"object"}],"description":"The user's input that caused the error.","title":"Input"},"loc":{"description":"The location of the error. Always contains 1 or 2 elements. The first element is the type of location (e.g. 'body', 'query', 'path', 'header'). The second element is the name of the field that caused the error. If the error is not related to a specific field, the second element is not present.","items":{"type":"string"},"title":"Loc","type":"array"},"msg":{"description":"The message of the error. The error message to show to the user.","title":"Msg","type":"string"},"type":{"description":"The type of the error. Useful for frontend code to handle different types of errors.","title":"Type","type":"string"}},"required":["loc","msg","type","input"],"title":"UnprocessableEntityIssue","type":"object"},"UnprocessableEntityResponse":{"properties":{"detail":{"description":"The detail of the error. This is the error message to show to the user. You should also use the issues field to show more detailed error messages per field. Use this field for a single liner error message.","title":"Detail","type":"string"},"issues":{"description":"The issues that caused the error. There can be multiple issues. Each issue is a user-facing error message.","items":{"$ref":"#/components/schemas/UnprocessableEntityIssue"},"title":"Issues","type":"array"}},"required":["detail","issues"],"title":"UnprocessableEntityResponse","type":"object"},"UnreachableReason":{"description":"Which address a contact lacks for the channels their sequence uses.\n\nDerived at read time from the contact's row and the graph, never stored.\nNamed by channel rather than as one \"missing contact details\", because the\nfix is different: an email-only cadence needs an address, a LinkedIn-only\none a profile URL.","enum":["no_email","no_linkedin_url","no_email_or_linkedin_url"],"title":"UnreachableReason","type":"string"},"UnreadCountReadSchema":{"properties":{"count":{"title":"Count","type":"integer"}},"required":["count"],"title":"UnreadCountReadSchema","type":"object"},"UnrecognisedEnrichmentContextSchema":{"description":"A context this build cannot parse.\n\nRead-side only: nothing ever writes it. The trail is append-only and\nkept forever, so it will always outlive the code that wrote it: a row\nfrom a newer deploy during a rollout, or one whose model later grew a\nfield without a default, would otherwise raise and take the whole page\nwith it. A feed that says \"something happened here\" beats a feed that\n500s.","properties":{"recorded_type":{"default":"","title":"Recorded Type","type":"string"},"type":{"const":"unrecognised","default":"unrecognised","title":"Type","type":"string"}},"title":"UnrecognisedEnrichmentContextSchema","type":"object"},"UnrecognisedSequenceContextSchema":{"description":"A context this build cannot parse. Read-side only; nothing writes it.","properties":{"recorded_type":{"default":"","title":"Recorded Type","type":"string"},"type":{"const":"unrecognised","default":"unrecognised","title":"Type","type":"string"}},"title":"UnrecognisedSequenceContextSchema","type":"object"},"UntouchedTablesSchema":{"description":"Tables nobody has opened or changed for a while, to think about archiving.","properties":{"days":{"description":"How long counts as untouched.","title":"Days","type":"integer"},"tables":{"description":"The tables, longest untouched first.","items":{"$ref":"#/components/schemas/TableReadSchema"},"title":"Tables","type":"array"}},"required":["days","tables"],"title":"UntouchedTablesSchema","type":"object"},"UpcomingSkipReadSchema":{"description":"The step the contact waits on, which will be skipped when they reach it.","properties":{"note":{"description":"Why, as one plain sentence.","title":"Note","type":"string"},"reason":{"$ref":"#/components/schemas/StepSkipReason","description":"Why: no_email or email_verdict on an email step, no_linkedin_url on a LinkedIn step. note says it as a sentence."},"step_id":{"format":"uuid","title":"Step Id","type":"string"},"verdict":{"anyOf":[{"$ref":"#/components/schemas/EmailDeliverability"},{"type":"null"}],"description":"The address's deliverability verdict on an email_verdict skip."}},"required":["step_id","reason","note"],"title":"UpcomingSkipReadSchema","type":"object"},"UpdateTableScheduleRequestSchema":{"description":"Change a table's cadence. Every field is optional.","properties":{"delete_missing_rows":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Delete Missing Rows"},"frequency":{"anyOf":[{"$ref":"#/components/schemas/TableScheduleFrequency"},{"type":"null"}]},"hour":{"anyOf":[{"maximum":23.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Hour"},"interval_unit":{"anyOf":[{"$ref":"#/components/schemas/TableScheduleIntervalUnit"},{"type":"null"}]},"interval_value":{"anyOf":[{"exclusiveMinimum":0.0,"maximum":365.0,"type":"integer"},{"type":"null"}],"title":"Interval Value"},"minute":{"anyOf":[{"maximum":59.0,"minimum":0.0,"type":"integer"},{"type":"null"}],"title":"Minute"},"paused":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Paused"},"time_zone":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"title":"Time Zone"}},"title":"UpdateTableScheduleRequestSchema","type":"object"},"UpdateTableSourceIdentityRequestSchema":{"description":"Which key to match the table's rows on from now on.","properties":{"identity_field":{"description":"The key to match rows on, one the identity options list as available.","maxLength":255,"minLength":1,"title":"Identity Field","type":"string"}},"required":["identity_field"],"title":"UpdateTableSourceIdentityRequestSchema","type":"object"},"UpdateTableSourceRequestSchema":{"description":"What may change on an existing source.","properties":{"row_limit":{"anyOf":[{"exclusiveMinimum":0.0,"maximum":2147483647.0,"type":"integer"},{"type":"null"}],"description":"New row ceiling; null lifts it.","title":"Row Limit"}},"title":"UpdateTableSourceRequestSchema","type":"object"},"UseAIExample":{"description":"One few-shot example: a sample input and the response it should get.","properties":{"input":{"maxLength":2000,"minLength":1,"title":"Input","type":"string"},"output":{"maxLength":2000,"minLength":1,"title":"Output","type":"string"}},"required":["input","output"],"title":"UseAIExample","type":"object"},"UseAISettings":{"description":"Settings for the Use AI action, in both of its modes.\n\nONE action covers both \"answer from what the table already knows\" and\n\"go and find out\", because from the author's seat they are the same\nrequest with a different reach, and splitting them made people pick the\nwrong one. ``web_research`` is that reach, and it is what selects the\nmode: off runs a single completion over the row, on runs the bounded\nresearch agent (search, map, scrape, cite).\n\nIt defaults OFF. The cheap mode is the common one, a web run costs\nseveral times more per row, and a toggle that silently spends is the\nwrong default even when research is the better answer.\n\n``context`` is \"Provide context for task\"; ``examples`` are the few-shot\npairs that show the model what a good response looks like. Both are\nhard-capped so a pathological configuration cannot blow up the request or\nthe cost.\n\n``use_row_context`` defaults ON, and a column stored before the field\nexisted decodes to that same default (deliberately), so an author who\nnever thought to reference a column still gets a model that can see the\nrow. Turning it off narrows the run back to what the prompt itself names.\n\n``context_column_ids`` narrows ``use_row_context`` from the whole row to\na chosen subset: None (the default, and what every column stored before\nthe field existed decodes to) keeps every column (\"Entire row\" in the\neditor) while a list holds exactly the columns the author picked. It\nmeans nothing while ``use_row_context`` is off.\n\nThe remaining fields only bite in web mode. They are held on this one\nmodel rather than a nested \"agent settings\" object so that flipping\n``web_research`` never migrates a stored payload: a column that has been\nboth ways keeps whatever research scope it was last given.","properties":{"context":{"anyOf":[{"maxLength":4000,"type":"string"},{"type":"null"}],"title":"Context"},"context_column_ids":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"The columns folded in when use_row_context is on; None means every column (\"Entire row\"). Stored by identity so renames are safe, but deliberately NOT a dependency: a listed column that is later deleted simply stops appearing in the context rather than blocking the delete or joining the recompute graph.","title":"Context Column Ids"},"examples":{"items":{"$ref":"#/components/schemas/UseAIExample"},"maxItems":5,"title":"Examples","type":"array"},"find_work_email":{"default":false,"description":"Whether the model may buy a work email from the product's data suppliers while it researches, paid from the run's research budget. Off by default. For a column linked to a saved agent, the agent's own switch decides and this one is ignored.","title":"Find Work Email","type":"boolean"},"kind":{"const":"use_ai","default":"use_ai","title":"Kind","type":"string"},"read_linkedin_profile":{"default":false,"description":"Whether the model may read a LinkedIn profile through the product's data suppliers while it researches, paid from the run's research budget. Off by default; ignored on a column linked to a saved agent.","title":"Read Linkedin Profile","type":"boolean"},"saved_agent_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Web research only: an org-level saved agent whose persona (effort, context) replaces this column's own.","title":"Saved Agent Id"},"starting_url_column_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Web research only: a column whose per-row value seeds the research. Stored by identity, so renames are safe.","title":"Starting Url Column Id"},"stay_on_domain":{"default":false,"description":"Web research only: confine every site-targeting tool to the starting URL's domain.","title":"Stay On Domain","type":"boolean"},"use_business_context":{"default":false,"description":"Whether the org's AI business context is folded into the run's standing context. Off by default and folded at run time: the org edits its context in one place and every column that opted in follows, with no stored copy to go stale.","title":"Use Business Context","type":"boolean"},"use_row_context":{"default":true,"description":"Whether the rest of this row's columns are folded in as context, on top of whatever the prompt itself references.","title":"Use Row Context","type":"boolean"},"web_research":{"default":false,"description":"Whether the model may research the web. On turns this column into a bounded research agent that searches, reads pages and cites its sources; off answers from the row and the model's own knowledge. Off by default: a web run costs several times more per row.","title":"Web Research","type":"boolean"}},"title":"UseAISettings","type":"object"},"ValueDistribution":{"properties":{"distinct_count":{"title":"Distinct Count","type":"integer"},"empty_count":{"title":"Empty Count","type":"integer"},"other_count":{"title":"Other Count","type":"integer"},"total_count":{"title":"Total Count","type":"integer"},"values":{"items":{"$ref":"#/components/schemas/ValueFrequency"},"title":"Values","type":"array"}},"required":["total_count","empty_count","distinct_count","values","other_count"],"title":"ValueDistribution","type":"object"},"ValueFrequency":{"properties":{"count":{"title":"Count","type":"integer"},"percentage":{"title":"Percentage","type":"number"},"value":{"title":"Value","type":"string"}},"required":["value","count","percentage"],"title":"ValueFrequency","type":"object"},"VanityCodeRequestSchema":{"description":"The custom code an affiliate wants to claim.","properties":{"code":{"description":"4-32 lowercase letters, digits or hyphens.","maxLength":32,"minLength":4,"title":"Code","type":"string"}},"required":["code"],"title":"VanityCodeRequestSchema","type":"object"},"VerbListResponseSchema":{"description":"The eight verbs, in display order.","properties":{"total_count":{"title":"Total Count","type":"integer"},"verbs":{"items":{"$ref":"#/components/schemas/VerbReadSchema"},"title":"Verbs","type":"array"}},"required":["verbs","total_count"],"title":"VerbListResponseSchema","type":"object"},"VerbReadSchema":{"description":"One of the eight verbs, as the settings pane and the agent editor list it.","properties":{"always_proposes":{"description":"Whether the verb always waits for a person, whatever was granted.","title":"Always Proposes","type":"boolean"},"key":{"$ref":"#/components/schemas/WorkspaceVerb"},"label":{"title":"Label","type":"string"}},"required":["key","label","always_proposes"],"title":"VerbReadSchema","type":"object"},"WaitingOn":{"description":"What a live contact is held behind in the approval queue, read at list time.\n\nDerived from the contact's task for its current step, never stored: the\ntask is the truth, and a copy on the enrolment would lag behind it.","enum":["approval","linkedin","send"],"title":"WaitingOn","type":"string"},"WithdrawConnectionRequestOutcome":{"additionalProperties":false,"description":"What withdrawing an invitation produced: the common fields and the nine profile facts.\n\n``invitation_pending`` re-read after the click is the verification. The\nledger row settles on the params' urn, not on anything read here.","properties":{"already_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Connected"},"already_following":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Already Following"},"can_send_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Send Message"},"found_already":{"anyOf":[{"$ref":"#/components/schemas/LinkedInFoundAlready"},{"type":"null"}]},"invitation_pending":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invitation Pending"},"kind":{"const":"withdraw_connection_request","default":"withdraw_connection_request","title":"Kind","type":"string"},"member_urn":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"title":"Member Urn"},"member_urns":{"items":{"maxLength":128,"type":"string"},"maxItems":8,"title":"Member Urns","type":"array"},"open_profile":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Open Profile"},"page_loaded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Page Loaded"},"profile_resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Profile Resolved"},"reason":{"anyOf":[{"$ref":"#/components/schemas/LinkedInSkipReason"},{"type":"null"}]},"vanity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity"}},"title":"WithdrawConnectionRequestOutcome","type":"object"},"WithdrawConnectionRequestParams":{"additionalProperties":false,"description":"Withdraw an invitation this sender already sent.\n\n``profile_url`` is where the browser goes first. ``member_urn`` is\nrequired, unlike everywhere else: the ledger row is keyed on it, the\ndispatcher read it off that row when it decided to withdraw, and\nsettlement closes the row by it.","properties":{"kind":{"const":"withdraw_connection_request","default":"withdraw_connection_request","title":"Kind","type":"string"},"member_urn":{"maxLength":128,"title":"Member Urn","type":"string"},"profile_url":{"maxLength":512,"title":"Profile Url","type":"string"}},"required":["profile_url","member_urn"],"title":"WithdrawConnectionRequestParams","type":"object"},"WorkspaceChatAttachmentKind":{"description":"What kind of thing a file the person attached is, for the card that shows it.\n\nEach kind is read by its own reader and drawn under its own icon: a CSV\nor an Excel file is a spreadsheet, rows under a header; a PDF is pages of\ntext, and the rows of the table its pages hold when one is asked for.","enum":["spreadsheet","pdf"],"title":"WorkspaceChatAttachmentKind","type":"string"},"WorkspaceChatConversationListResponseSchema":{"description":"One person's conversations.","properties":{"conversations":{"items":{"$ref":"#/components/schemas/WorkspaceChatConversationReadSchema"},"title":"Conversations","type":"array"},"total_count":{"title":"Total Count","type":"integer"}},"required":["conversations","total_count"],"title":"WorkspaceChatConversationListResponseSchema","type":"object"},"WorkspaceChatConversationReadSchema":{"description":"One conversation, as the history lists it.\n\n``title`` and ``pinned`` come from the thread list's overlay when the\nconversation was renamed or pinned there, so this history and the union\nlist on the Chat page name and order the same thread the same way.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"last_message_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Message At"},"pinned":{"default":false,"description":"Pinned in the thread list. Pinned conversations are listed first.","title":"Pinned","type":"boolean"},"title":{"title":"Title","type":"string"}},"required":["id","title","last_message_at","created_at"],"title":"WorkspaceChatConversationReadSchema","type":"object"},"WorkspaceChatErrorReason":{"description":"Why a turn could not run, for a client choosing what to show instead.","enum":["limit","paused","not_found"],"title":"WorkspaceChatErrorReason","type":"string"},"WorkspaceChatMessageCreateSchema":{"description":"Send the AI Assistant a message.","properties":{"attachment_ids":{"description":"The files sent with this message, as the attachments route returned them when they were uploaded: CSV, Excel or PDF, each of them yours and not yet sent with another message. The assistant reads a spreadsheet's columns and rows and a PDF's pages. Optional.","items":{"format":"uuid","type":"string"},"maxItems":10,"title":"Attachment Ids","type":"array"},"page":{"anyOf":[{"$ref":"#/components/schemas/PageContextSchema"},{"type":"null"}],"description":"What you have open, so the assistant can resolve 'this table' without you naming it. Optional."},"pasted":{"anyOf":[{"items":{"maxLength":200,"type":"string"},"maxItems":1000,"type":"array"},{"type":"null"}],"description":"A list you pasted rather than typed: domains, emails, names, one per entry. Sent as data instead of prose, so the assistant reads it as a list and the conversation shows it as a count rather than a wall of text. Optional.","title":"Pasted"},"prompt":{"maxLength":4000,"minLength":1,"title":"Prompt","type":"string"},"quote":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{"type":"null"}],"description":"Part of an earlier reply you selected, sent with your words so the assistant knows what they refer to. Kept with the message and shown above it in the conversation. Optional.","title":"Quote"}},"required":["prompt"],"title":"WorkspaceChatMessageCreateSchema","type":"object"},"WorkspaceChatMessageListResponseSchema":{"description":"A conversation's transcript, oldest first.","properties":{"messages":{"items":{"$ref":"#/components/schemas/WorkspaceChatMessageReadSchema"},"title":"Messages","type":"array"},"total_count":{"title":"Total Count","type":"integer"}},"required":["messages","total_count"],"title":"WorkspaceChatMessageListResponseSchema","type":"object"},"WorkspaceChatMessageReadSchema":{"description":"One message in a conversation, with the action cards a reply raised.\n\nDeliberately leaves out why a failed turn failed and what it cost: the\nfirst can carry a supplier's own words, and the tokens, the dollars and\nthe model are the operator's, kept on the row for the costs page and\nnever returned here. The cards ride on the message so a transcript\nrenders them under the right reply without a second request.\n\n``duration_ms`` is the exception to that rule, and deliberately so: how\nlong an answer took is the customer's own time, and a reply that says it\ntook forty seconds reads as work rather than as a stall.","properties":{"actions":{"description":"The actions this reply proposed or applied, in the order the AI Assistant named them, as they stand now. Empty for user messages and replies that acted on nothing.","items":{"$ref":"#/components/schemas/ActionProposalReadSchema"},"title":"Actions","type":"array"},"attachments":{"description":"The files sent with this message, in the order they were added, each as the card above the message draws it. Empty for a reply, and for a message sent with none.","items":{"$ref":"#/components/schemas/ChatAttachmentReadSchema"},"title":"Attachments","type":"array"},"content":{"title":"Content","type":"string"},"conversation_id":{"format":"uuid","title":"Conversation Id","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"How long this turn took end to end, in milliseconds. Null for your own messages and for a reply saved before the clock existed.","title":"Duration Ms"},"id":{"format":"uuid","title":"Id","type":"string"},"page":{"anyOf":[{"$ref":"#/components/schemas/PageContextSchema"},{"type":"null"}],"description":"Where the person was when they sent this message: the page, the thing open on it and the names it showed them then. Null for a reply, and for a message sent with no page."},"pasted_count":{"description":"How many entries the person pasted alongside these words. The list itself is not returned: the transcript shows \"128 domains\", not the domains. Zero when nothing was pasted.","title":"Pasted Count","type":"integer"},"pasted_kind":{"anyOf":[{"$ref":"#/components/schemas/PastedKind"},{"type":"null"}],"description":"What the pasted list holds, so the transcript can say \"128 domains\" the way the composer did: `domains`, `emails`, `names`, or `entries` for a list of nothing in particular. Null when nothing was pasted."},"plan":{"description":"The task list the AI Assistant published before starting a job with several steps in it, in order. Empty when it did not publish one, which is every short answer.","items":{"type":"string"},"title":"Plan","type":"array"},"plan_done":{"description":"How many of the plan's steps the AI Assistant marked done, counted from the first: 2 means the first two are done. Zero when nothing was marked, and for a reply with no plan.","title":"Plan Done","type":"integer"},"question":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceChatQuestion"},{"type":"null"}],"description":"The one clarifying question this turn ended on, with whole answers to tap. Tapping one sends it as the next message. Null when the turn did not ask anything."},"quote":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The part of an earlier reply the person selected and asked about, as it stood when they took it, shown above their words. Null for a reply, and for a message that quoted nothing.","title":"Quote"},"role":{"$ref":"#/components/schemas/WorkspaceChatRole"},"segments":{"description":"A reply that paused for approval, split where it paused: each part's text, then the cards that part raised, in order. Draw each part's text directly above its own cards. `content` still holds every part's text joined, and a `failed` reply's `content` is its failure sentence, which is in no part. Empty for a reply that never paused and for replies saved before parts were kept: draw `content`, then every card.","items":{"$ref":"#/components/schemas/WorkspaceChatSegmentReadSchema"},"title":"Segments","type":"array"},"sequence":{"title":"Sequence","type":"integer"},"status":{"$ref":"#/components/schemas/WorkspaceChatStatus"},"steps":{"description":"The trail this turn showed while it ran, as it was shown. Empty for user messages.","items":{"$ref":"#/components/schemas/AiStep"},"title":"Steps","type":"array"},"suggestion_kinds":{"description":"What each of `suggestions` is about, in the same order and as many, which picks the icon it wears: `business_context`, `email`, `phone`, `sequence`, `agent`, `table`, `search`, `inbox`, `mailbox` or `other`. Empty for a reply saved before kinds were kept.","items":{"$ref":"#/components/schemas/NextStepKind"},"title":"Suggestion Kinds","type":"array"},"suggestions":{"description":"Up to three follow-ups the AI Assistant offered, each written as a message you would send. Empty when it offered none.","items":{"type":"string"},"title":"Suggestions","type":"array"}},"required":["id","conversation_id","sequence","role","status","content","steps","actions","pasted_count","pasted_kind","attachments","quote","page","plan","plan_done","question","suggestions","suggestion_kinds","duration_ms","segments","created_at"],"title":"WorkspaceChatMessageReadSchema","type":"object"},"WorkspaceChatQuestion":{"description":"One clarifying question a turn ended on, with the answers to tap.\n\n``options`` are whole replies, ready to send as the next message, never\nletters or numbers to pick from: tapping one is the same as typing it, so\na person who wants to say something else still can.","properties":{"options":{"items":{"maxLength":300,"type":"string"},"maxItems":6,"title":"Options","type":"array"},"text":{"maxLength":500,"title":"Text","type":"string"}},"required":["text"],"title":"WorkspaceChatQuestion","type":"object"},"WorkspaceChatRole":{"description":"Who wrote a message.","enum":["user","assistant"],"title":"WorkspaceChatRole","type":"string"},"WorkspaceChatSegmentReadSchema":{"description":"One part of a reply that paused for approval: its words, then the cards they are about.\n\nA turn that pauses on a card and carries on once it is decided is one\nreply. Its parts are what each run of it said, each followed by the cards\nthat run raised, so a transcript draws the words about a card directly\nabove that card.","properties":{"action_ids":{"description":"The ids of the cards this part raised, in order, to draw under its text. Each is one of the reply's `actions`; an id with no card there is a card gone since, and is skipped.","items":{"format":"uuid","type":"string"},"title":"Action Ids","type":"array"},"text":{"description":"What this part of the reply said, as markdown. Empty when the part only raised cards.","title":"Text","type":"string"}},"required":["text","action_ids"],"title":"WorkspaceChatSegmentReadSchema","type":"object"},"WorkspaceChatStatus":{"description":"Whether a turn finished.\n\nA reply is written PENDING in the same transaction as the person's\nmessage, before the model is called, and filled in as COMPLETE or FAILED\nonce the turn is saved. So a question is never on disk without a reply\nrow under it: a crashed turn is saved FAILED rather than dropped, and a\nturn whose process died between the two transactions is a reply still\npending, which the abandoned-turn sweep fails. Either way the user sees\na reply they can retry instead of a question with nothing under it.","enum":["pending","waiting","complete","failed"],"title":"WorkspaceChatStatus","type":"string"},"WorkspaceChatStopResponseSchema":{"description":"A Stop was asked for. Whether it lands is the stream's to say.\n\nThe flag is cooperative and best effort: the turn reads it before its\nmodel call and while the model writes, and a turn that has already landed\nis not affected. The stream reports the outcome as a `result` whose reply\ncarries `failed` and reads `Stopped by you`. Echoes the turn the Stop was\naddressed to, as the `turn` frame named it.","properties":{"conversation_id":{"format":"uuid","title":"Conversation Id","type":"string"},"user_message_sequence":{"title":"User Message Sequence","type":"integer"}},"required":["conversation_id","user_message_sequence"],"title":"WorkspaceChatStopResponseSchema","type":"object"},"WorkspaceChatStreamErrorSchema":{"description":"The data of an SSE ``error`` frame, and the ``detail`` of a refused turn.\n\n``reason`` is set when the turn never ran: ``limit`` (the workspace's\nallowance is spent), ``paused`` (the AI Assistant is switched off) or\n``not_found`` (the conversation is not the caller's). It is null for\nanything else.","properties":{"detail":{"title":"Detail","type":"string"},"reason":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceChatErrorReason"},{"type":"null"}]}},"required":["detail","reason"],"title":"WorkspaceChatStreamErrorSchema","type":"object"},"WorkspaceChatTableConversationResponseSchema":{"description":"The conversation that made a table, when it is yours.","properties":{"conversation":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceChatConversationReadSchema"},{"type":"null"}],"description":"The AI Assistant conversation whose action created this table, as the history lists it. Null when the table was not made in a conversation, when a colleague made it (their conversations are private to them), or when that conversation has been deleted."}},"required":["conversation"],"title":"WorkspaceChatTableConversationResponseSchema","type":"object"},"WorkspaceChatTurnResponseSchema":{"description":"Both halves of one turn, as saved.\n\nThe user message too, not just the reply: the client drew its own copy\nbefore sending and reconciles it against this one.","properties":{"assistant_message":{"$ref":"#/components/schemas/WorkspaceChatMessageReadSchema"},"user_message":{"$ref":"#/components/schemas/WorkspaceChatMessageReadSchema"}},"required":["user_message","assistant_message"],"title":"WorkspaceChatTurnResponseSchema","type":"object"},"WorkspaceChatUnavailableResponseSchema":{"description":"A refused turn: the sentence to show, and why.","properties":{"detail":{"$ref":"#/components/schemas/WorkspaceChatStreamErrorSchema"}},"required":["detail"],"title":"WorkspaceChatUnavailableResponseSchema","type":"object"},"WorkspaceVerb":{"description":"The eight things an AI may do to a workspace.\n\nExactly eight, not sixty: today's cell-level actions all run against one\ncell, and building a table, adding contacts to a sequence and starting a\nsearch had no home at all. Anything new here is a product decision about\nwhat an assistant may touch, not a convenience for a planner.","enum":["create_table_from_search","add_column","run_column","enrich_rows","add_contacts_to_sequence","push_to_destination","call_endpoint","start_search"],"title":"WorkspaceVerb","type":"string"},"WritableIntegrationSchema":{"description":"One connected integration a table can export to.","properties":{"health_status":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The connection's last recorded health ('healthy', 'warning' or 'error'), or None when it has never been checked. A broken connection is shown greyed, never hidden.","title":"Health Status"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The provider's icon, or None.","title":"Icon Url"},"integration_id":{"format":"uuid","title":"Integration Id","type":"string"},"integration_type":{"description":"Provider slug, e.g. 'postgresql'.","title":"Integration Type","type":"string"},"name":{"description":"The connection's display name.","title":"Name","type":"string"},"record_types":{"description":"The record types this connection can write, with their actions.","items":{"$ref":"#/components/schemas/WritableRecordTypeSchema"},"title":"Record Types","type":"array"}},"required":["integration_id","integration_type","name","icon_url","health_status","record_types"],"title":"WritableIntegrationSchema","type":"object"},"WritableRecordTypeSchema":{"description":"One destination record type and the write actions it supports.","properties":{"actions":{"description":"The write actions this record type's capabilities allow.","items":{"$ref":"#/components/schemas/ExportWriteAction"},"title":"Actions","type":"array"},"display_name":{"description":"The record type as the picker shows it.","title":"Display Name","type":"string"},"is_custom":{"description":"True for the wildcard entry of a destination whose real object names need live discovery (a database's tables).","title":"Is Custom","type":"boolean"},"slug":{"description":"The record type as the SDK spells it; '*' is Custom.","title":"Slug","type":"string"}},"required":["slug","display_name","is_custom","actions"],"title":"WritableRecordTypeSchema","type":"object"},"WriteCapabilitiesSchema":{"description":"What one destination record type can actually do, fully derived.","properties":{"actions":{"description":"The write actions this record type supports, including composite upsert.","items":{"$ref":"#/components/schemas/ExportWriteAction"},"title":"Actions","type":"array"},"bulk_actions":{"description":"Action values with a synchronous bulk write method: the ones a batched export can actually use.","items":{"type":"string"},"title":"Bulk Actions","type":"array"},"can_match":{"description":"Whether an existing record can be found by field value: the precondition for replay-safe creates. False means only blind creates are possible and the editor must say so.","title":"Can Match","type":"boolean"},"identity_fields_by_action":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Selectable match/identity fields per action value. An EMPTY list means the destination resolves identity dynamically (a database: any column), and the picker falls back to the discovered fields.","title":"Identity Fields By Action","type":"object"},"suggested_batch_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The destination's own recommended batch size, or None.","title":"Suggested Batch Size"},"supports_bulk":{"description":"Whether records can be written in batches.","title":"Supports Bulk","type":"boolean"},"update_modes":{"description":"Supported write modes (replace, patch, set_once) for update/upsert.","items":{"type":"string"},"title":"Update Modes","type":"array"}},"required":["actions","identity_fields_by_action","update_modes","supports_bulk","bulk_actions","suggested_batch_size","can_match"],"title":"WriteCapabilitiesSchema","type":"object"}},"securitySchemes":{"APIKeyHeader":{"in":"header","name":"X-API-Key","type":"apiKey"},"HTTPBearer":{"scheme":"bearer","type":"http"}}},"info":{"contact":{"email":"support@getoneprofile.ai","name":"Oneprofile Support"},"description":"REST API reference for Oneprofile, the GTM data layer for your CRM. Manage tables, enrichments, and integrations. Authenticate with an API key to get started.","termsOfService":"https://www.getoneprofile.ai/terms","title":"API Reference | Oneprofile","version":"1.0.39298396951"},"openapi":"3.1.0","paths":{"/affiliate/enroll/":{"post":{"description":"Enroll the caller's workspace, idempotently: enrolling twice returns the existing profile. Open self-serve: the program's gates live at payout, not at the door. Requires a signed-in user rather than an API key, because enrollment records who the affiliate is.","operationId":"enroll_affiliate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateEnrollRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateProfileReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Enroll in the affiliate program","tags":["affiliate"]}},"/affiliate/feed/":{"get":{"description":"Recent signups, conversions and money movements as an anonymous feed, newest first. Rows say what happened, never who.","operationId":"list_affiliate_feed","parameters":[{"description":"Maximum rows returned.","in":"query","name":"limit","required":false,"schema":{"default":50,"description":"Maximum rows returned.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AffiliateFeedItemReadSchema"},"title":"Response List Affiliate Feed","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the affiliate activity feed","tags":["affiliate"]}},"/affiliate/ledger/":{"get":{"description":"The itemized, signed history of every commission, clawback, payout and adjustment, newest first.","operationId":"list_affiliate_ledger_entries","parameters":[{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdOccurredAtCreatedAt","default":"occurred_at","enum":["id","occurred_at","created_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AffiliateLedgerEntryReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the affiliate ledger","tags":["affiliate"]}},"/affiliate/payout-email/":{"patch":{"description":"Set the PayPal account payouts are sent to. Every change restarts the destination hold: a payout will not use an email set within the last few days. Requires a signed-in user, because this is where the money goes, so an API key is not enough.","operationId":"update_affiliate_payout_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutEmailUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateProfileReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not enrolled."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Set the payout email","tags":["affiliate"]}},"/affiliate/payouts/":{"get":{"description":"The caller's monthly payouts, newest first.","operationId":"list_affiliate_payouts","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AffiliatePayoutReadSchema"},"title":"Response List Affiliate Payouts","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List payouts","tags":["affiliate"]}},"/affiliate/performance/":{"get":{"description":"The overview's whole measurement surface in one read: the click, signup, conversion and earnings funnel over a window with each step against the equally long window before it; the rates over those steps; lifetime gross, clawed-back and net commission; where the referral roster stands; when pending commission matures; and what the next monthly payout run would send. A rate whose denominator is too small to state honestly comes back null rather than as a number nobody should act on.","operationId":"get_affiliate_performance","parameters":[{"description":"The window these figures cover.","in":"query","name":"days","required":false,"schema":{"default":30,"description":"The window these figures cover.","maximum":365,"minimum":1,"title":"Days","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliatePerformanceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the affiliate performance figures","tags":["affiliate"]}},"/affiliate/program/":{"get":{"description":"What the program pays right now, for the landing page and the signup flow. Deliberately unauthenticated: the person who most needs it has no account yet. Terms only: nothing here resolves a code to the person behind it.","operationId":"get_affiliate_program","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateProgramReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"summary":"Get the affiliate program's current terms","tags":["affiliate"]}},"/affiliate/referrals/":{"get":{"description":"The affiliate's referrals with the terms and money attached to each, newest first. Anonymous by design, like the feed: a row says what a referral pays and under which stamped rate, never who it is.","operationId":"list_affiliate_referrals","parameters":[{"description":"Maximum rows returned.","in":"query","name":"limit","required":false,"schema":{"default":100,"description":"Maximum rows returned.","maximum":200,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AffiliateReferralReadSchema"},"title":"Response List Affiliate Referrals","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the affiliate referrals","tags":["affiliate"]}},"/affiliate/sources/":{"get":{"description":"How each traffic source the affiliate tagged has performed. A source is the affiliate's own `s=` parameter on a link they shared; untagged traffic comes back under an empty source.","operationId":"list_affiliate_source_stats","parameters":[{"description":"How many days back to include.","in":"query","name":"days","required":false,"schema":{"default":90,"description":"How many days back to include.","maximum":365,"minimum":1,"title":"Days","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AffiliateSourceStatReadSchema"},"title":"Response List Affiliate Source Stats","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the affiliate per-source performance","tags":["affiliate"]}},"/affiliate/stats/":{"get":{"description":"The dashboard's headline numbers on their own, for cheap refreshes.","operationId":"get_affiliate_stats","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateStatsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the affiliate headline stats","tags":["affiliate"]}},"/affiliate/stats/daily/":{"get":{"description":"The per-day series behind the dashboard graphs: signups, paying conversions and earnings per day, up to one year back. Days with no activity are absent.","operationId":"list_affiliate_daily_stats","parameters":[{"description":"How many days back to include.","in":"query","name":"days","required":false,"schema":{"default":365,"description":"How many days back to include.","maximum":365,"minimum":1,"title":"Days","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AffiliateDailyStatReadSchema"},"title":"Response List Affiliate Daily Stats","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the affiliate per-day stats","tags":["affiliate"]}},"/affiliate/summary/":{"get":{"description":"Standing, codes, the shareable link, the headline stats and the program terms: everything the dashboard's overview needs in one read.","operationId":"get_affiliate_summary","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateSummaryReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not enrolled."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the affiliate dashboard summary","tags":["affiliate"]}},"/affiliate/vanity-code/":{"post":{"description":"Claim the affiliate's one custom code, the name a creator says out loud instead of a random string. First come, first served across the whole program. Requires a signed-in user rather than an API key: the code is claimed once and is the affiliate's public name.","operationId":"claim_affiliate_vanity_code","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VanityCodeRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateCodeReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not enrolled."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Claim a custom affiliate code","tags":["affiliate"]}},"/affiliate/verification/":{"post":{"description":"Create the hosted identity-verification flow and return its URL. The dashboard shows this only once a payout is actually available. Requires a signed-in user rather than an API key, and is rationed: each verification costs a fee, and starting one is a step a person takes, not a script.","operationId":"start_affiliate_verification","responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityVerificationReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not enrolled."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Start identity verification","tags":["affiliate"]}},"/agent-sending/":{"get":{"description":"Whether this workspace has paused the replies the agent sends without anyone reading them first, and whether Oneprofile has paused them for every workspace. While either is on, the agent's replies wait in Needs approval.","operationId":"get_agent_sending","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSendingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read whether the agent's own sending is paused","tags":["outbound-agents"]},"put":{"description":"Pausing holds every reply the agent would send on its own for a person to approve; writing carries on. Any signed-in person may pause; only an admin may resume. Not available to API keys, the assistant or MCP clients: this is a kill switch, and a person throws it.","operationId":"set_agent_sending","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSendingUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSendingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Asked through the assistant, or a member asked to resume."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Pause or resume the agent's own sending","tags":["outbound-agents"]}},"/agent-training/saved-agents/{saved_agent_id}/sample-rows/":{"post":{"description":"Example input rows to fill the training grid with, so the author is not asked to invent test data for an agent they have not run. Real values are read from one of the org's own tables when a table's columns can feed every input; otherwise they are written from the agent's prompt and the workspace's business context. The set is remembered on the agent, so asking again offers the same rows until `regenerate` is sent or the agent's inputs change. Read-only against the workspace: no session, no runs, no credits.","operationId":"suggest_training_sample_rows","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SampleRowsRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SampleRowsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest example rows to train on","tags":["agent-training"]}},"/agent-training/saved-agents/{saved_agent_id}/sessions/":{"post":{"description":"Pin a set of training inputs (read from a table or typed by hand) and run the agent over all of them. The session is remembered: reviewing it, critiquing rows and approving prompt revisions all resume where they were left.","operationId":"start_training_session","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"409":{"description":"The session is not in a state for this"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Start a training session","tags":["agent-training"]}},"/agent-training/saved-agents/{saved_agent_id}/sessions/live/":{"get":{"description":"The agent's one in-progress training session, so opening the Train page picks the conversation back up. 404 when there is none.","operationId":"get_live_training_session","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No live training session"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get an agent's live training session","tags":["agent-training"]}},"/agent-training/saved-agents/{saved_agent_id}/table-preview/":{"post":{"description":"The first rows a table source would feed the agent, resolved through the same reader the real session uses, so a value that shows blank here is a value that would have run blank. Read-only: no session, no runs, no credits.","operationId":"preview_training_table_rows","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingTablePreviewRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingTablePreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent or table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Preview the rows a table would train on","tags":["agent-training"]}},"/agent-training/sessions/{session_id}/abandon/":{"post":{"description":"Throw the session away, freeing the agent for a fresh one. The rows and critiques stay as history. Idempotent.","operationId":"abandon_training_session","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Training session not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Discard a training session","tags":["agent-training"]}},"/agent-training/sessions/{session_id}/approve/":{"post":{"description":"Save the proposal onto the live agent (which bumps its version, so the existing history and revert still apply), then re-run the same training rows for the next cycle. Columns deployed from this agent pick the new prompt up on their next run.","operationId":"approve_training_proposal","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingApproveRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Training session not found"},"409":{"description":"The session is not in a state for this"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Approve a proposed prompt","tags":["agent-training"]}},"/agent-training/sessions/{session_id}/complete/":{"post":{"description":"Close the session out as finished, keeping its rows and critiques as history. Idempotent.","operationId":"complete_training_session","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Training session not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Finish a training session","tags":["agent-training"]}},"/agent-training/sessions/{session_id}/propose/":{"post":{"description":"Rewrite the agent's prompt from this cycle's verdicts, fixing the rows marked bad without losing the ones marked good. Needs at least one bad row. Only the prompt is proposed (the output shape, model and tools are never machine-written) and every declared {{input}} placeholder is verified to survive before the proposal is shown.","operationId":"propose_training_revision","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingProposeRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Training session not found"},"409":{"description":"The session is not in a state for this"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"The proposal could not be generated"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Propose a revised prompt","tags":["agent-training"]}},"/agent-training/sessions/{session_id}/reject/":{"post":{"description":"Discard the pending proposal and this cycle's critiques, so the next attempt starts from a fresh read of the same outputs. Earlier cycles' critiques are kept.","operationId":"reject_training_proposal","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Training session not found"},"409":{"description":"The session is not in a state for this"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Reject a proposed prompt","tags":["agent-training"]}},"/agent-training/sessions/{session_id}/rows/{row_id}/feedback/":{"put":{"description":"Record this cycle's good-or-bad verdict on one row's output. A bad verdict must carry a note saying what to change; a good one carries none. A null verdict withdraws whatever was recorded.","operationId":"save_training_feedback","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}},{"in":"path","name":"row_id","required":true,"schema":{"format":"uuid","title":"Row Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingFeedbackUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Session or row not found"},"409":{"description":"The session is not in a state for this"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Save a row's verdict","tags":["agent-training"]}},"/ai-apps/":{"get":{"description":"The AI apps (Claude, ChatGPT, Claude Code and others) people have connected to this workspace through Oneprofile's MCP server: which app, who connected it, whether it may make changes, and when it was last used.","operationId":"list_ai_apps","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiAppListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List connected AI apps","tags":["ai_apps"]}},"/ai-apps/requests/{request_id}/":{"get":{"description":"What the consent page shows: the app asking to connect, where the person returns afterwards, and the workspaces they may connect it to. Only the signed-in person may read it.","operationId":"get_ai_app_request","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"maxLength":64,"minLength":1,"title":"Request Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiAppRequestReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Asked through an AI, not a person."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The request expired or was answered."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Workspaces could not be read."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read an AI app's request to connect","tags":["ai_apps"]}},"/ai-apps/requests/{request_id}/approve/":{"post":{"description":"The person's yes on the consent page: connects the app to the workspace they picked, with the access they chose, and answers where to send them back to the app. Connecting the same app to the same workspace again replaces the earlier connection.","operationId":"approve_ai_app_request","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"maxLength":64,"minLength":1,"title":"Request Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiAppApproveSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiAppAnswerSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Asked through an AI, not a person."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The request expired or was answered."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Workspaces could not be read."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Connect an AI app","tags":["ai_apps"]}},"/ai-apps/requests/{request_id}/deny/":{"post":{"description":"The person's no on the consent page: nothing is connected, and the answer says where to send them back to the app.","operationId":"deny_ai_app_request","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"maxLength":64,"minLength":1,"title":"Request Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiAppAnswerSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Asked through an AI, not a person."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The request expired or was answered."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Turn down an AI app","tags":["ai_apps"]}},"/ai-apps/{ai_app_id}/":{"delete":{"description":"Disconnect an AI app from this workspace: its sign-in stops working at once, and the app has to be connected again to use Oneprofile. You can disconnect your own apps; a workspace admin can disconnect anybody's.","operationId":"disconnect_ai_app","parameters":[{"in":"path","name":"ai_app_id","required":true,"schema":{"format":"uuid","title":"Ai App Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Somebody else's app, and not an admin."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such connected app."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Disconnect an AI app","tags":["ai_apps"]}},"/ai-context/":{"get":{"description":"Get the organization's AI business context: company description, ideal customer profile, buyer personas, interest signals and social proof. Creates an empty record on first read. Includes the latest generation run so a reloaded page can resume polling one that is still running.","operationId":"get_ai_context","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the AI context","tags":["ai-context","mcp-always-include"]},"patch":{"description":"Edit the AI business context fields. Omitted fields are left untouched; a field set to null is cleared.","operationId":"update_ai_context","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update the AI context","tags":["ai-context","mcp-searchable-tool"]}},"/ai-context/autofill/":{"post":{"description":"Write a new organization's business context from the company domain in the signed-in user's email address, then return the context as the GET does. Safe to call on every page load: it does nothing when the address is consumer webmail, when any context field already has text in it, when a generation has been run before, or when the signed-in user is not the person who created the organization. The response is the context record plus the generation run, so a caller can poll the run it just started without a second request.","operationId":"autofill_ai_context","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Write the AI context from the signup domain","tags":["ai-context"]}},"/ai-context/documents/":{"get":{"description":"List the reference documents attached to the organization's business context, oldest first. Poll this while any document's status is `processing`; reading one takes roughly 10-60 seconds.","operationId":"list_ai_context_documents","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDocumentListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the reference documents","tags":["ai-context","mcp-searchable-tool"]}},"/ai-context/documents/drive/":{"post":{"description":"Attach files the signed-in user picked in the Google Picker. Each is fetched with that user's own drive.file grant, read in the background and summarized. A file that is already linked is returned as its existing document.","operationId":"link_ai_context_documents_from_drive","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDriveLinkRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDocumentsCreatedSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Drive is not connected, a file cannot be reached, or the workspace is full."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"Google rejected the token refresh; the grant is gone."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Link reference documents from Google Drive","tags":["ai-context"]}},"/ai-context/documents/upload/":{"post":{"description":"Attach a file to the organization's business context. The file is read in the background and summarized; only that summary is added to AI prompts, never the file itself. Accepts PDF, Word, PowerPoint, text, markdown and CSV files.","operationId":"upload_ai_context_document","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_ai_context_document"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDocumentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The file type is not supported, or the workspace is full."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Upload a reference document","tags":["ai-context"]}},"/ai-context/documents/{document_id}/":{"delete":{"description":"Remove a document from the business context and delete its stored file. A document linked from Google Drive is only unlinked; the file stays in Drive.","operationId":"delete_ai_context_document","parameters":[{"in":"path","name":"document_id","required":true,"schema":{"format":"uuid","title":"Document Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Document not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a reference document","tags":["ai-context"]},"get":{"description":"Read one reference document's current state and summary.","operationId":"get_ai_context_document","parameters":[{"in":"path","name":"document_id","required":true,"schema":{"format":"uuid","title":"Document Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDocumentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Document not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a reference document","tags":["ai-context"]},"patch":{"description":"Rename a document, rewrite its summary by hand, or take it in or out of the business context. Omitted fields are left untouched.","operationId":"update_ai_context_document","parameters":[{"in":"path","name":"document_id","required":true,"schema":{"format":"uuid","title":"Document Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDocumentUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDocumentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Document not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a reference document","tags":["ai-context"]}},"/ai-context/documents/{document_id}/download/":{"get":{"description":"The only way a reference document's bytes leave private storage, and it is authenticated. Takes the document's ID, never a storage key.","operationId":"download_ai_context_document","parameters":[{"in":"path","name":"document_id","required":true,"schema":{"format":"uuid","title":"Document Id","type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{}},"description":"The file."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Document not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Download a reference document","tags":["ai-context"]}},"/ai-context/documents/{document_id}/refresh/":{"post":{"description":"Re-read a linked file if it changed in Drive since it was last read. An unchanged file costs one metadata call and returns the document as it is.","operationId":"refresh_ai_context_document","parameters":[{"in":"path","name":"document_id","required":true,"schema":{"format":"uuid","title":"Document Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDocumentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Document not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Not a Drive document, already being read, Drive not connected, or the file cannot be reached."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"Google rejected the token refresh; the grant is gone."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Refresh a reference document from Google Drive","tags":["ai-context"]}},"/ai-context/documents/{document_id}/summarize/":{"post":{"description":"Write the document's summary again from the text already read out of it. Does not re-read the file. Replaces a summary that was edited by hand.","operationId":"summarize_ai_context_document","parameters":[{"in":"path","name":"document_id","required":true,"schema":{"format":"uuid","title":"Document Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextDocumentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Document not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The document is already being read, or was never read."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rewrite a reference document's summary","tags":["ai-context"]}},"/ai-context/generate/":{"post":{"description":"Research the company domain in the background and overwrite the AI business context with the result. Returns the generation run to poll; generation takes roughly 10-60 seconds. Only one generation can run per organization at a time.","operationId":"generate_ai_context","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextGenerateRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextGenerationJobReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Generate the AI context from a domain","tags":["ai-context"]}},"/ai-context/generate/{job_id}/":{"get":{"description":"Poll a generation run until its status is terminal. On success the AI context record has already been overwritten with the generated fields.","operationId":"get_ai_context_generation_job","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"format":"uuid","title":"Job Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiContextGenerationJobReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Run not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a generation run","tags":["ai-context"]}},"/apikey/":{"get":{"description":"List all API keys for the user. Requires a user authentication (not API key).","operationId":"list_api_keys","parameters":[{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtName","default":"id","enum":["id","created_at","updated_at","name"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"asc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_APIKeyRead_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List API keys","tags":["apikey"]},"post":{"description":"Create a new API key for the user. Requires a user authentication (not API key).\n\nThe response carries the key's value, and it is the only time it is ever shown: only a hash of it is stored. Keys that can write are part of every paid plan; a workspace on the free plan can create read-only keys.","operationId":"create_api_key","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreatedSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"An API key with the generated key already exists, or the workspace's plan does not allow the scope asked for."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create an API key","tags":["apikey"]}},"/apikey/length/":{"get":{"description":"Get the number of API keys for the organization.","operationId":"count_api_keys","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCount"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the number of API keys","tags":["apikey"]}},"/apikey/scopes/":{"get":{"description":"What a new key in this workspace may be allowed to do. A workspace on a paid plan can create read or write keys; the free plan can create read keys.","operationId":"list_api_key_scopes","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyScopesReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the API key scopes this workspace may create","tags":["apikey"]}},"/apikey/{api_key_id}/":{"delete":{"description":"Delete an API key by its ID. Requires a user authentication (not API key).","operationId":"delete_api_key","parameters":[{"in":"path","name":"api_key_id","required":true,"schema":{"format":"uuid","title":"Api Key Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The API key was not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete an API key","tags":["apikey"]},"get":{"description":"Get an API key by its ID. Requires a user authentication (not API key).","operationId":"get_api_key","parameters":[{"in":"path","name":"api_key_id","required":true,"schema":{"format":"uuid","title":"Api Key Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyRead"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The API key was not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get an API key","tags":["apikey"]},"patch":{"description":"Update an API key by its ID. Requires a user authentication (not API key).","operationId":"update_api_key","parameters":[{"in":"path","name":"api_key_id","required":true,"schema":{"format":"uuid","title":"Api Key Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyRead"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The API key was not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update an API key","tags":["apikey"]}},"/app-listings/callback/":{"post":{"description":"Validate the OAuth callback and return a pending-connection id.","operationId":"callback","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingCallbackRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingCallbackResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"App listing not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Exchange an app listing OAuth callback","tags":["app-listings"]}},"/app-listings/connections/{connection_id}/claim-onto-existing/":{"post":{"description":"Re-authorize an existing integration in place from a switch/reconnect OAuth grant. The target integration and intent are read from the pending connection (bound server-side from the OAuth state), so the grant can only re-authorize the integration it was started for. Preserves every sync, schedule, mapping, alert, and history row on the connection.","operationId":"claim_onto_existing","parameters":[{"in":"path","name":"connection_id","required":true,"schema":{"maxLength":255,"minLength":1,"title":"Connection Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingClaimOntoExistingResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Pending connection or target not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Finalize a switch/reconnect onto an existing integration","tags":["app-listings"]}},"/app-listings/connections/{connection_id}/config/":{"get":{"description":"Return the tenant/region/login config the engine captured for a pending OAuth connection (e.g. Salesforce login_url), so the create wizard can show the customer (read-only) the workspace they linked. Empty for one-click listings.","operationId":"get_connection_config","parameters":[{"in":"path","name":"connection_id","required":true,"schema":{"maxLength":255,"minLength":1,"title":"Connection Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingConnectionConfigResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Pending connection not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a pending connection's captured connect-time config","tags":["app-listings"]}},"/app-listings/install/":{"post":{"description":"Return the provider OAuth authorize URL for connecting an app listing.","operationId":"install","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingInstallRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingInstallResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"App listing not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Start an app listing OAuth install","tags":["app-listings"]}},"/app-listings/preflight/":{"post":{"description":"Confirm a customer's hand-typed workspace/tenant resolves before redirecting to the vendor login. Returns found, not_found, or unreachable.","operationId":"preflight","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingPreflightRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingPreflightResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"App listing not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Check a workspace resolves before connecting","tags":["app-listings"]}},"/app-listings/{slug}/connect-inputs/":{"get":{"description":"Return the per-customer inputs (tenant address, region, or a choice) the connect modal collects before the OAuth redirect. Empty for one-click listings.","operationId":"list_connect_inputs","parameters":[{"in":"path","name":"slug","required":true,"schema":{"maxLength":255,"minLength":1,"title":"Slug","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppListingConnectInputsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"App listing not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List an app listing's connect-time inputs","tags":["app-listings"]}},"/assistant/actions/":{"get":{"description":"Every action the AI Assistant proposed or applied in one chat conversation, in the order it made them, whatever became of each: proposed, applied, dismissed or failed. Or, by table, the actions still waiting on someone whose arguments name that table, newest first: the cards a table's own page shows, including the one a scheduled search raises with no conversation behind it. Each card quotes the price the operation carried when it was proposed, in credits, and names who decided it.","operationId":"list_workspace_actions","parameters":[{"description":"The chat conversation whose actions to list.","in":"query","name":"conversation_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The chat conversation whose actions to list.","title":"Conversation Id"}},{"description":"The table whose waiting actions to list, newest first.","in":"query","name":"table_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The table whose waiting actions to list, newest first.","title":"Table Id"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionProposalListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Conversation not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the AI Assistant's proposed and applied actions","tags":["workspace-actions"]}},"/assistant/actions/approve-batch/":{"post":{"description":"Apply several proposals at once: the cards one AI Assistant reply raised, decided together. Each is applied on its own, so one that cannot run comes back `failed` with its reason while the rest still apply, and a card already decided comes back unchanged rather than as an error.\n\n`scope` means the same thing it does on a single approval and is applied to every card named.","operationId":"approve_workspace_actions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionApproveBatchSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionApproveBatchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such action."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Approve every action one reply proposed","tags":["workspace-actions"]}},"/assistant/actions/{proposal_id}/":{"get":{"description":"One card by id: what a notification links to. A scheduled search's card has no conversation, so this is the only way to reach it by the link.","operationId":"get_workspace_action","parameters":[{"in":"path","name":"proposal_id","required":true,"schema":{"format":"uuid","title":"Proposal Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionProposalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Proposal not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read one proposed or applied action","tags":["workspace-actions"]}},"/assistant/actions/{proposal_id}/approve/":{"post":{"description":"Apply a proposal on your say-so. Idempotent: approving an action that already applied returns it unchanged, so a second click applies nothing twice. An action whose apply is refused (the balance is empty, or cannot cover what has to be paid before it starts; the object it names is gone) comes back `failed` with the reason on the card, not as an error. A run charged as it fills may start when the most it could cost is more than the balance: it stops when the credits run out and keeps what it filled.\n\n`scope` says whether the next one like it should still ask: `once` decides this card alone, `thread` allows the operation for the rest of the conversation, `project_me` allows it for you across the workspace and `project_all` for everybody in it. A send is never grantable and asks again whatever is chosen.","operationId":"approve_workspace_action","parameters":[{"in":"path","name":"proposal_id","required":true,"schema":{"format":"uuid","title":"Proposal Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ActionApproveSchema"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionProposalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Proposal not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionConflictResponseSchema"}}},"description":"The proposal is not in a state this decision applies to."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Approve a proposed action","tags":["workspace-actions"]}},"/assistant/actions/{proposal_id}/dismiss/":{"post":{"description":"Decline a proposal. Nothing runs, and the card records who said no.","operationId":"dismiss_workspace_action","parameters":[{"in":"path","name":"proposal_id","required":true,"schema":{"format":"uuid","title":"Proposal Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionProposalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Proposal not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionConflictResponseSchema"}}},"description":"The proposal is not in a state this decision applies to."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Dismiss a proposed action","tags":["workspace-actions"]}},"/assistant/chat/conversations/":{"get":{"description":"List your own general chat conversations with the AI Assistant, most recently active first. A conversation with no messages yet is left out. Private to the person who started them: nobody else in the workspace sees them.","operationId":"list_workspace_chat_conversations","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatConversationListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List AI Assistant chat conversations","tags":["assistant"]},"post":{"description":"Start an empty conversation. Create it before the first message so the conversation exists for the whole of that turn; it takes its title from the first message.","operationId":"create_workspace_chat_conversation","responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatConversationReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Start an AI Assistant chat conversation","tags":["assistant"]}},"/assistant/chat/conversations/made-table/{table_id}/":{"get":{"description":"Find your own AI Assistant conversation whose action created this table. `conversation` is null when the table was not made in a conversation, when a colleague made it (conversations are private to whoever started them), or when that conversation has been deleted.","operationId":"get_workspace_chat_conversation_that_made_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatTableConversationResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Find the AI Assistant conversation that made a table","tags":["assistant"]}},"/assistant/chat/conversations/{conversation_id}/messages/":{"get":{"description":"List a conversation's messages in the order they happened, each reply with the trail it showed and the action cards it raised, as they stand now. A reply whose `status` is `pending` is a turn still running: its content is the words written so far, up to a second behind, and its trail the steps taken so far. A turn whose process died before that is shown `failed` once its time is up.","operationId":"list_workspace_chat_messages","parameters":[{"in":"path","name":"conversation_id","required":true,"schema":{"format":"uuid","title":"Conversation Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatMessageListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Conversation not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List AI Assistant chat messages","tags":["assistant"]},"post":{"description":"Run one turn and answer when it is done: the fallback for a client that cannot open the streaming route. The AI Assistant answers questions about the workspace and the product, and takes the eight workspace actions when asked: each lands as a card under the reply, applied when the workspace's rules allow it and proposed for approval otherwise. A request that needs a table's rows or a search it cannot run is answered with where to ask it.\n\nA turn that breaks still answers 201, with the reply's `status` set to `failed`: an error status would roll back the row that records it. A refused turn (the workspace's allowance is spent, or the AI Assistant is paused) answers 429 and writes nothing. A message naming a file that is not yours, or was already sent, answers 422 and writes nothing.","operationId":"send_workspace_chat_message","parameters":[{"in":"path","name":"conversation_id","required":true,"schema":{"format":"uuid","title":"Conversation Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatMessageCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatTurnResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Conversation not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatUnavailableResponseSchema"}}},"description":"The workspace's allowance is spent, or the AI Assistant is paused"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Ask the AI Assistant","tags":["assistant"]}},"/assistant/chat/conversations/{conversation_id}/messages/stream/":{"post":{"description":"Run one turn and stream it as Server-Sent Events: a `plan` frame whenever the AI Assistant publishes or ticks its plan, a `step` frame for each thing the AI Assistant actually did (read_context when the workspace has a business context, then plan, then write_column, retry_column and price_column for a column the message described, then one apply_action per action it applied), one `turn` frame naming the saved user message's sequence once it is saved (the Stop route is addressed by it), `delta` frames carrying the whole reply so far (assign, never append), a `said` frame when a later round of the turn starts writing (the words the reply showed until then, now a step: put `step` at `at` among the steps sent and empty the reply, which the next `delta` fills), then exactly one `result` frame with the same body the non-streaming route returns, the reply carrying its action cards, sent once the reply is saved. The last `delta` always equals the saved reply.\n\nA turn that could not run ends in one `error` frame whose `reason` is `limit`, `paused` or `not_found`; a message naming a file that is not yours or was already sent ends in an `error` frame with no reason and nothing saved; any other failure is an `error` frame with no reason. A turn that breaks while running still ends in a `result` whose reply carries `failed`, and so does a stopped one, its reply reading `Stopped by you`.\n\nClosing the connection does not cancel the turn: it finishes and saves its reply, so reopening the conversation shows the answer.","operationId":"stream_workspace_chat_message","parameters":[{"in":"path","name":"conversation_id","required":true,"schema":{"format":"uuid","title":"Conversation Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatMessageCreateSchema"}}},"required":true},"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/WorkspaceChatTurnResponseSchema","type":"string"}}},"description":"A stream of Server-Sent Events. The final `result` frame's `data` is a turn; an `error` frame's `data` is a stream error."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Ask the AI Assistant, streaming its work","tags":["assistant"]}},"/assistant/chat/conversations/{conversation_id}/messages/{sequence}/resume/":{"post":{"description":"Continue the turn whose reply sits at `sequence` and is `waiting`, once every card it raised has been approved or declined. Streams the same frames as sending a message: `delta` frames carrying the whole reply so far, a `said` frame when a later round starts writing, then one `result`, or another `approval` if the turn goes on to ask for something else.\n\nEnds in an `error` frame with reason `not_found` when there is no waiting turn at that position, and an `error` frame with no reason while any of its cards is still undecided. Costs nothing against the workspace's allowance: the turn was claimed when it started.","operationId":"resume_workspace_chat_message","parameters":[{"in":"path","name":"conversation_id","required":true,"schema":{"format":"uuid","title":"Conversation Id","type":"string"}},{"in":"path","name":"sequence","required":true,"schema":{"title":"Sequence","type":"integer"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/WorkspaceChatTurnResponseSchema","type":"string"}}},"description":"A stream of Server-Sent Events, ending in one `result`, `approval` or `error` frame."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Resume an AI Assistant turn waiting on your approval","tags":["assistant"]}},"/assistant/chat/conversations/{conversation_id}/messages/{sequence}/stop/":{"post":{"description":"Ask the turn whose user message sits at `sequence` (the streaming route's `turn` frame names it) to stop at its next check. The turn stops before its model call, or within a second while the model writes, and lands as a `result` whose reply carries `failed` and reads `Stopped by you`; the workspace's allowance is not charged for it. Idempotent, and harmless once the turn has landed: a Stop nobody is listening for expires on its own.","operationId":"stop_workspace_chat_message","parameters":[{"in":"path","name":"conversation_id","required":true,"schema":{"format":"uuid","title":"Conversation Id","type":"string"}},{"in":"path","name":"sequence","required":true,"schema":{"title":"Sequence","type":"integer"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChatStopResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Conversation not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Stop an AI Assistant chat turn","tags":["assistant"]}},"/assistant/conversations/{conversation_id}/grants/":{"get":{"description":"What this chat conversation applies without asking, as it stands now: the write operations the AI Assistant runs unasked here (approving a card for this conversation adds one) and the verbs, and whether that list is the workspace defaults (read live, so a change in Settings reaches it) or the conversation's own, frozen the first time it allowed something. Anything on the list still asks when it is priced at or above the approval threshold, and a send always asks.","operationId":"get_conversation_grants","parameters":[{"in":"path","name":"conversation_id","required":true,"schema":{"format":"uuid","title":"Conversation Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationGrantsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Conversation not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read what a conversation may apply without asking","tags":["workspace-actions"]},"patch":{"description":"Change the conversation's grant list. Take one operation back by sending `granted_tools` without it, or one verb by sending `granted_verbs` without it; a field left out keeps its half as it was. Send `granted_verbs` as null to follow the workspace defaults again, operations included. An empty list allows nothing and still stops following the defaults. A verb that always asks (pushing to a destination) cannot be granted and is refused.","operationId":"update_conversation_grants","parameters":[{"in":"path","name":"conversation_id","required":true,"schema":{"format":"uuid","title":"Conversation Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationGrantsUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationGrantsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Conversation not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Change what a conversation may apply without asking","tags":["workspace-actions"]}},"/assistant/prompts/":{"get":{"operationId":"list_assistant_prompts","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantPromptListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the saved prompts","tags":["assistant-prompt"]},"post":{"operationId":"save_assistant_prompt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantPromptCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantPromptReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The workspace has saved as many prompts as it may."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Save a prompt","tags":["assistant-prompt"]}},"/assistant/prompts/{prompt_id}/":{"delete":{"operationId":"delete_assistant_prompt","parameters":[{"in":"path","name":"prompt_id","required":true,"schema":{"format":"uuid","title":"Prompt Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such prompt."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a saved prompt","tags":["assistant-prompt"]},"patch":{"operationId":"update_assistant_prompt","parameters":[{"in":"path","name":"prompt_id","required":true,"schema":{"format":"uuid","title":"Prompt Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantPromptUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantPromptReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such prompt."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rewrite a saved prompt","tags":["assistant-prompt"]}},"/assistant/settings/":{"get":{"description":"The workspace's rules for what the AI Assistant may apply without asking: the credit threshold at or above which every action proposes, the verbs a new conversation may apply on its own, and the write operations it may call without asking. Created with the defaults on first read.","operationId":"get_assistant_settings","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSettingsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read the AI Assistant's action settings","tags":["workspace-actions"]},"patch":{"description":"Set the threshold, the default grants, or any of them. A verb that always asks (pushing to a destination) cannot be granted and is refused. The verb list and the operation list are independent: changing one leaves the other exactly as it was.","operationId":"update_assistant_settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSettingsUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSettingsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Change the AI Assistant's action settings","tags":["workspace-actions"]}},"/assistant/threads/":{"get":{"description":"List your threads across every assistant (a table's, a lead search's, an agent's, the general chat's) in one list: pinned first, then most recently active first. Your own threads, plus the workspace's shared legacy table threads that nobody is recorded as starting. Deleted threads are left out.\n\nPaged by an opaque cursor rather than an offset: the page after a cursor starts after that row's place in the order, so a thread pinned or deleted between two requests never shifts the next page.","operationId":"list_assistant_threads","parameters":[{"description":"Only threads whose title or message text contains this, case-insensitively.","in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Only threads whose title or message text contains this, case-insensitively.","title":"Search"}},{"description":"The `next_cursor` of the page before, for the page after it.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"maxLength":512,"minLength":1,"type":"string"},{"type":"null"}],"description":"The `next_cursor` of the page before, for the page after it.","title":"Cursor"}},{"description":"Rows per page.","in":"query","name":"limit","required":false,"schema":{"default":50,"description":"Rows per page.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThreadListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List AI Assistant threads","tags":["assistant"]}},"/assistant/threads/{origin}/{thread_id}/":{"delete":{"description":"Delete a thread: hidden from the list now, purged from its store thirty days later. A table thread's pending column suggestions and a chat thread's actions still waiting for approval are dismissed with it; anything already accepted or applied is untouched. A thread that is not yours answers 404.","operationId":"delete_assistant_thread","parameters":[{"in":"path","name":"origin","required":true,"schema":{"$ref":"#/components/schemas/ThreadOrigin"}},{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Thread not found, or not the caller's"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete an AI Assistant thread","tags":["assistant"]},"patch":{"description":"Rename a thread, pin or unpin it, or both. The rename is kept beside the store's own title, so the list shows it and the store keeps naming the thread after its first message. A thread that is not yours answers 404, the same as one that does not exist.","operationId":"update_assistant_thread","parameters":[{"in":"path","name":"origin","required":true,"schema":{"$ref":"#/components/schemas/ThreadOrigin"}},{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThreadUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThreadReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Thread not found, or not the caller's"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rename or pin an AI Assistant thread","tags":["assistant"]}},"/assistant/threads/{origin}/{thread_id}/link/":{"post":{"description":"Record that this thread continues in another: the lead search that produced a table, and the table's thread it carried on in. Written on both ends, so each thread's row shows the link. Both threads must be yours; either one that is not answers 404.","operationId":"link_assistant_thread","parameters":[{"in":"path","name":"origin","required":true,"schema":{"$ref":"#/components/schemas/ThreadOrigin"}},{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThreadLinkSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThreadLinkResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Thread not found, or not the caller's"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Link an AI Assistant thread to the one it continues in","tags":["assistant"]}},"/assistant/tools/":{"get":{"description":"Every tool the AI Assistant may use on your behalf: what it does, which part of the product it belongs to, whether using it changes anything, and whether your workspace may allow it to run without asking. The writes are the ones the settings page can allow; the reads are listed so you can see what it is able to look at.","operationId":"list_assistant_tools","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List what the AI Assistant can do","tags":["assistant"]}},"/assistant/verbs/":{"get":{"description":"The eight verbs, with their labels and the one static rule: whether the verb always asks first.","operationId":"list_workspace_verbs","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerbListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the actions the AI Assistant can take","tags":["workspace-actions"]}},"/attribution/signup-source/":{"post":{"description":"Record the marketing page or campaign the caller's workspace signed up from: the `src` tag and the `utm_source`, `utm_medium` and `utm_campaign` values the register link carried. The app sends it once, right after signup. First touch wins: a workspace keeps the first source recorded for it, and one that is no longer registering records nothing. Neither is an error; both report `recorded: false`. Requires a signed-in user rather than an API key: a signup has a person behind it.","operationId":"claim_signup_source","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupSourceClaimRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupSourceClaimReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Workspace not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Record where a new workspace came from","tags":["attribution"]}},"/billing/credit-prices/":{"get":{"description":"The unit price of each billable operation, in credits, plus the dollar value of a credit. Code-defined and identical for every organization: this is what the plan page's usage calculator quotes from.","operationId":"list_credit_prices","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditPricesReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List published credit prices","tags":["billing"]}},"/billing/credit_packs/":{"get":{"description":"Get the one-time credit pack pricing, presets, and remaining monthly purchase limit. Pass ?credits= to price a specific amount.","operationId":"get_credit_pack_quote","parameters":[{"description":"Credit amount to price.","in":"query","name":"credits","required":false,"schema":{"anyOf":[{"maximum":100000000,"minimum":1,"type":"integer"},{"type":"null"}],"description":"Credit amount to price.","title":"Credits"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditPackQuoteReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get credit pack quote","tags":["billing"]}},"/billing/credit_packs/checkout/":{"post":{"description":"Start a one-time credit pack purchase via Stripe Checkout. Only available on paid plans; the amount must be within the configured minimum and the remaining monthly purchase limit.","operationId":"start_credit_pack_checkout","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditPackCheckoutRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditPackCheckoutResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid credit pack purchase request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Start a credit pack purchase","tags":["billing"]}},"/billing/portal/":{"post":{"description":"Create a billing portal session to manage payment methods and invoices, and to cancel the subscription. This API is only available for paid plans. If you call this API for a free plan, you will get a validation error.","operationId":"create_billing_portal_session","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BillingPortalRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPortalResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create billing portal session","tags":["billing"]}},"/billing/products/":{"get":{"description":"List all available billing products with their pricing information.","operationId":"list_products","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List available products","tags":["billing"]}},"/billing/subscription/":{"get":{"description":"Get the subscription information for the organization.","operationId":"get_subscription","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionRead"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get subscription information","tags":["billing"]}},"/billing/switch_plan/":{"post":{"description":"Switch the organization to a new subscription plan, credit volume, or billing interval. Returns the Stripe URL to send the customer to: hosted Checkout for a first paid subscription, or the billing portal's confirmation flow for a change to an existing one, where Stripe shows the proration and takes the confirmation.","operationId":"switch_plan","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchPlanRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchPlanRedirectResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid plan switch request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Switch subscription plan","tags":["billing"]}},"/billing/transactions/":{"get":{"description":"List the organization's Stripe invoices, newest first: subscription invoices and one-time credit pack invoices. Empty for organizations that never had a Stripe customer.","operationId":"list_transactions","parameters":[{"description":"Maximum number of invoices to return.","in":"query","name":"limit","required":false,"schema":{"default":25,"description":"Maximum number of invoices to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"description":"Stripe invoice ID cursor for pagination.","in":"query","name":"starting_after","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Stripe invoice ID cursor for pagination.","title":"Starting After"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List billing transactions","tags":["billing"]}},"/chat-attachments/":{"post":{"description":"Upload a CSV, Excel or PDF file to send with your next message to the AI Assistant. The file is read once here: a spreadsheet's column names and row count, or a PDF's page count, come back for the card in the composer, and the assistant reads the file when the message is sent. Name the file's `id` in the message's `attachment_ids`; a file never sent can be removed again.\n\nFiles up to 10 MB, and PDFs up to 500 pages with text to read (a scan has none). The format is decided by the file's own bytes, not its name.","operationId":"upload_chat_attachment","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_chat_attachment"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAttachmentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Add a file to send with an AI Assistant message","tags":["assistant"]}},"/chat-attachments/{attachment_id}/":{"delete":{"description":"Remove a file you added and have not sent: the X on its card in the composer. A file already sent with a message stays with that message and is not found here.","operationId":"delete_chat_attachment","parameters":[{"in":"path","name":"attachment_id","required":true,"schema":{"format":"uuid","title":"Attachment Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"File not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Remove a file added to an AI Assistant message before it was sent","tags":["assistant"]},"get":{"description":"Read what a file you attached is, as its card in the composer shows it: its name, its kind (`spreadsheet` or `pdf`), its size, a spreadsheet's columns and row count or a PDF's page count, and whether it was sent. Its contents are read through its rows or, for a PDF, its pages. Only your own files.","operationId":"read_chat_attachment","parameters":[{"in":"path","name":"attachment_id","required":true,"schema":{"format":"uuid","title":"Attachment Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAttachmentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"File not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read a file attached to an AI Assistant message","tags":["assistant"]}},"/chat-attachments/{attachment_id}/columns/{source_index}/values/":{"get":{"description":"Inspect one column of your attached CSV or XLSX file, or of the table a PDF you attached holds. Counts cover every nonblank data row in its sheet, with the top 20 values, percentages of all rows, empty and distinct counts, and other_count. Raw values are paged in file order without coercion. source_index is zero-based, counted as a page of the file's rows shows its columns; `sheet` reads another workbook sheet, and `header_row` names the row holding the column names under a title.","operationId":"read_chat_attachment_column_values","parameters":[{"in":"path","name":"attachment_id","required":true,"schema":{"format":"uuid","title":"Attachment Id","type":"string"}},{"in":"path","name":"source_index","required":true,"schema":{"title":"Source Index","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"title":"Limit","type":"integer"}},{"description":"A workbook sheet by name; omit for the attached sheet.","in":"query","name":"sheet","required":false,"schema":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"A workbook sheet by name; omit for the attached sheet.","title":"Sheet"}},{"description":"The row holding the column names under a title, numbered as a page of the file's rows numbers them; the column is named from it and counted over the rows below. 0 keeps the first row.","in":"query","name":"header_row","required":false,"schema":{"default":0,"description":"The row holding the column names under a title, numbered as a page of the file's rows numbers them; the column is named from it and counted over the rows below. 0 keeps the first row.","minimum":0,"title":"Header Row","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAttachmentColumnValuesResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Column or source not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read an attached file column's value distribution and raw values","tags":["assistant","mcp-searchable-tool"]}},"/chat-attachments/{attachment_id}/import/":{"post":{"description":"Create a table from a file attached to a message, every column of the file becoming a column of the table with a type read off its values, and start adding the file's rows to it in the background. Takes any size of file the plan's row limit allows, so it is the way to turn a whole lead list into a table. A PDF becomes the table its pages hold, its columns named as the PDF names them. When the file's first row is a title, `header_row` names the row that holds the column names, and `row_ranges` picks rows numbered as a page of the file's rows shows them. The table exists when this returns; poll the import job to follow the rows arriving. Only your own files.","operationId":"import_chat_attachment_as_table","parameters":[{"in":"path","name":"attachment_id","required":true,"schema":{"format":"uuid","title":"Attachment Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAttachmentImportRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAttachmentImportResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Plan table limit reached. Upgrade to create more tables."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"File not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Build a table from a file attached to an AI Assistant message","tags":["assistant"]}},"/chat-attachments/{attachment_id}/pages/":{"get":{"description":"Read some of a PDF's pages as text, each laid out as the page prints it: a table's columns stay side by side and each of its rows stays one line, with the gaps between columns cut to three spaces. `offset` is the first page wanted, counted from zero, and `limit` the most to read; a read also stops at a size, so read on from `next_offset`. A spreadsheet has rows instead of pages. Only your own files.","operationId":"read_chat_attachment_pages","parameters":[{"in":"path","name":"attachment_id","required":true,"schema":{"format":"uuid","title":"Attachment Id","type":"string"}},{"description":"The first page wanted, counted from zero.","in":"query","name":"offset","required":false,"schema":{"default":0,"description":"The first page wanted, counted from zero.","minimum":0,"title":"Offset","type":"integer"}},{"description":"How many pages to read, at most 50.","in":"query","name":"limit","required":false,"schema":{"default":50,"description":"How many pages to read, at most 50.","maximum":50,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAttachmentPagesResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"File not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read pages of a PDF attached to an AI Assistant message","tags":["assistant"]}},"/chat-attachments/{attachment_id}/rows/":{"get":{"description":"Read one page of a file's rows as text, one cell per column, together with the sheet's column names and its whole row count. `offset` is the first row wanted, counted from zero under the header, and `limit` is the most to read; a page also stops at a size, so page on from `next_offset`. For a workbook, `sheet` reads another sheet, and each page lists the sheets and carries the cell comments on its rows. A PDF's rows are the table its pages hold: the first read of them reads the table off its pages, which takes a few seconds a page, and is refused when the PDF holds no table or more than one. Only your own files: a file someone else attached is not found.","operationId":"read_chat_attachment_rows","parameters":[{"in":"path","name":"attachment_id","required":true,"schema":{"format":"uuid","title":"Attachment Id","type":"string"}},{"description":"A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.","in":"query","name":"sheet","required":false,"schema":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"description":"A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.","title":"Sheet"}},{"description":"The first row wanted, counted from zero under the header.","in":"query","name":"offset","required":false,"schema":{"default":0,"description":"The first row wanted, counted from zero under the header.","minimum":0,"title":"Offset","type":"integer"}},{"description":"How many rows to read, at most 200.","in":"query","name":"limit","required":false,"schema":{"default":200,"description":"How many rows to read, at most 200.","maximum":200,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAttachmentRowsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"File not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read rows of a file attached to an AI Assistant message","tags":["assistant"]}},"/cooldown/settings/":{"get":{"operationId":"get_cooldown_settings","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CooldownSettingsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read the workspace's cooldown rules","tags":["contact_cooldown"]},"patch":{"description":"The dial can be left off. Off is where every existing workspace starts. Turning it off or shortening it lets go on the contacts it stopped that it no longer would, where they stood.","operationId":"update_cooldown_settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CooldownSettingsUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CooldownSettingsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update the workspace's cooldown rules","tags":["contact_cooldown"]}},"/credits/ledger/":{"get":{"description":"The raw immutable ledger (detailed retention window only), newest first by default.","operationId":"list_credit_ledger","parameters":[{"in":"query","name":"entry_kind","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CreditEntryKind"},{"type":"null"}],"title":"Entry Kind"}},{"description":"Only entries of any of these kinds. Repeat the parameter for each kind. Use this rather than several requests when a surface shows a mix ('where did my credits come from', say, which wants every kind except usage charges).","in":"query","name":"entry_kind__in","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreditEntryKind"},"maxItems":20,"type":"array"},{"type":"null"}],"description":"Only entries of any of these kinds. Repeat the parameter for each kind. Use this rather than several requests when a surface shows a mix ('where did my credits come from', say, which wants every kind except usage charges).","title":"Entry Kind  In"}},{"in":"query","name":"start_time","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Start Time"}},{"in":"query","name":"end_time","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"End Time"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdOccurredAtCreatedAtUpdatedAt","default":"occurred_at","enum":["id","occurred_at","created_at","updated_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CreditLedgerEntrySchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List credit ledger entries","tags":["credits"]}},"/credits/summary/":{"get":{"description":"The global credit meter: available balance, period allowance, refill date, and the low/blocked flags. Cheap to poll; lazily creates the balance with the plan's initial grant on first access.","operationId":"get_credit_summary","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalanceSummarySchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the credit balance summary","tags":["credits"]}},"/credits/usage/balance_timeseries/":{"get":{"description":"Get the balance series for the usage overview chart.","operationId":"get_balance_timeseries","parameters":[{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}},{"in":"query","name":"interval","required":false,"schema":{"default":"day","enum":["hour","day"],"title":"Interval","type":"string"}},{"description":"IANA timezone for buckets","in":"query","name":"timezone","required":false,"schema":{"default":"UTC","description":"IANA timezone for buckets","title":"Timezone","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalanceTimeseriesResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the balance-over-time series","tags":["credits"]}},"/credits/usage/by_agent/":{"get":{"description":"Get credit spend grouped by the saved agent behind each column.","operationId":"get_usage_by_agent","parameters":[{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditAttributionResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get credit spend attributed to saved agents","tags":["credits"]}},"/credits/usage/by_provider/":{"get":{"description":"Get the provider/account attribution report.","operationId":"get_usage_by_provider","parameters":[{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditAttributionResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get credit spend attributed to providers and accounts","tags":["credits"]}},"/credits/usage/by_table/":{"get":{"description":"Get the table/column attribution report.","operationId":"get_usage_by_table","parameters":[{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditAttributionResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get credit spend attributed to tables and columns","tags":["credits"]}},"/credits/usage/by_table/{table_id}/by_column/":{"get":{"description":"Get one table's per-column usage.","operationId":"get_table_usage_by_column","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTableUsageByColumnResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get one table's per-column credit usage","tags":["credits"]}},"/credits/usage/by_table/{table_id}/by_run/":{"get":{"description":"Get one table's per-run usage, newest first.","operationId":"get_table_usage_by_run","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTableUsageByRunResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get one table's per-run credit usage","tags":["credits"]}},"/credits/usage/by_table/{table_id}/timeseries/":{"get":{"description":"Get one table's spend series for the per-table usage dialog.","operationId":"get_table_spend_timeseries","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}},{"in":"query","name":"interval","required":false,"schema":{"default":"day","enum":["hour","day"],"title":"Interval","type":"string"}},{"description":"IANA timezone for buckets","in":"query","name":"timezone","required":false,"schema":{"default":"UTC","description":"IANA timezone for buckets","title":"Timezone","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditSpendTimeseriesResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get one table's spend series","tags":["credits"]}},"/credits/usage/export/":{"get":{"description":"One endpoint serves every report; filters mirror the source endpoints. Streams synchronously; the ledger export reads in keyset batches.","operationId":"export_credit_usage","parameters":[{"in":"query","name":"report","required":true,"schema":{"$ref":"#/components/schemas/CreditExportReport"}},{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}},{"in":"query","name":"interval","required":false,"schema":{"default":"day","enum":["hour","day"],"title":"Interval","type":"string"}},{"description":"IANA timezone for buckets","in":"query","name":"timezone","required":false,"schema":{"default":"UTC","description":"IANA timezone for buckets","title":"Timezone","type":"string"}},{"in":"query","name":"table_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Table Id"}},{"in":"query","name":"entry_kind","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CreditEntryKind"},{"type":"null"}],"title":"Entry Kind"}}],"responses":{"200":{"content":{"text/csv":{}},"description":"The report as a CSV file."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Export a usage report as CSV","tags":["credits"]}},"/credits/usage/meta/":{"get":{"description":"Where usage history starts and the boundary before which data is served from monthly rollups.","operationId":"get_credit_usage_meta","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditUsageMetaSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get usage history boundaries","tags":["credits"]}},"/credits/usage/spend_timeseries/":{"get":{"description":"Get the spend series for the usage overview chart.","operationId":"get_spend_timeseries","parameters":[{"description":"Range start (ISO 8601)","in":"query","name":"start_time","required":true,"schema":{"description":"Range start (ISO 8601)","format":"date-time","title":"Start Time","type":"string"}},{"description":"Range end (ISO 8601)","in":"query","name":"end_time","required":true,"schema":{"description":"Range end (ISO 8601)","format":"date-time","title":"End Time","type":"string"}},{"in":"query","name":"interval","required":false,"schema":{"default":"day","enum":["hour","day"],"title":"Interval","type":"string"}},{"description":"IANA timezone for buckets","in":"query","name":"timezone","required":false,"schema":{"default":"UTC","description":"IANA timezone for buckets","title":"Timezone","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditSpendTimeseriesResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the credits-spent series","tags":["credits"]}},"/design-partner/feedback/":{"get":{"description":"Everything this workspace has told us, newest first. The whole organization sees every member's submissions: the page is addressed to the organization, and a partner should be able to read what a colleague already asked for instead of asking again.","operationId":"list_design_partner_feedback","parameters":[{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAt","default":"created_at","enum":["id","created_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_DesignPartnerFeedbackReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the workspace's design partner feedback","tags":["design-partner"]},"post":{"description":"Record one submission from the caller. Any member of a design partner workspace may submit. Requires a signed-in user rather than an API key: the record is of who said this, and an API key has no person behind it.","operationId":"submit_design_partner_feedback","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignPartnerFeedbackCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignPartnerFeedbackReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Send design partner feedback","tags":["design-partner"]}},"/design-partner/slack-channel/invite/":{"post":{"description":"Send the workspace's invitation to the address in the body. With no channel yet this starts the run that creates one and sends the invitation from inside it, and answers `provisioning` for the page to poll; with a channel ready the invitation goes out immediately.\n\nA workspace gets one invitation to its channel, so a second call while the first is still live is a 409 rather than a second email. Nothing here happens on a page load: the address is required, so a call without a body is a 422.\n\nA refusal Slack itself made, their Slack being on a free plan for instance, is not an error: it comes back in the body with a sentence to show them.","operationId":"invite_to_design_partner_slack_channel","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignPartnerSlackInviteCreateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignPartnerSlackReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found"},"409":{"description":"The invitation cannot be sent as things stand."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Send the workspace's shared Slack channel invite","tags":["design-partner"]}},"/design-partner/status/":{"get":{"description":"The probe the dashboard uses to decide whether the design partner page exists for this workspace, plus everything that page needs above the fold. Answers 200 with `is_design_partner: false` rather than a 404 so an ordinary session never logs an auth failure for a page it was never offered.","operationId":"get_design_partner_status","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignPartnerStatusReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Is this workspace a design partner?","tags":["design-partner"]}},"/do-not-contact/":{"get":{"description":"One page of the list, newest first unless `order_by` says otherwise: `created_at` orders by when each entry was added, `value` by the address or domain. Ties go by id, so paging with `offset` never repeats or skips an entry.","operationId":"list_do_not_contact","parameters":[{"in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":320,"type":"string"},{"type":"null"}],"title":"Search"}},{"in":"query","name":"kind","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SuppressionKind"},{"type":"null"}],"title":"Kind"}},{"in":"query","name":"order_by","required":false,"schema":{"default":"created_at","enum":["created_at","value"],"title":"Order By","type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionPageSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List do-not-contact entries","tags":["suppression"]},"post":{"description":"Paste or upload addresses and domains in bulk; duplicates are ignored.","operationId":"add_do_not_contact","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionAddSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionAddResultSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Add do-not-contact entries","tags":["suppression"]}},"/do-not-contact/delete/":{"post":{"description":"Removal is deliberate and manual-only; no automated path unsuppresses. A contact an entry a person added stopped before any step reached them goes on from step one, as a new contact would; one already reached stays as it is, and so does everyone an unsubscribe, a bounce or an inbox Do not contact put on the list.","operationId":"delete_do_not_contact","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionDeleteSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionDeleteResultSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete do-not-contact entries","tags":["suppression"]}},"/do-not-contact/export/":{"get":{"description":"Plain text, one value per line, importable anywhere.","operationId":"export_do_not_contact","responses":{"200":{"content":{"application/json":{"schema":{}}},"description":"Plain text file, one value per line."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Export the do-not-contact list","tags":["suppression"]}},"/find-leads/attached-tables/":{"get":{"description":"The tables in this workspace that already have a lead search on them. A table has at most one, so a picker offering a destination should show these as unavailable while the person is choosing instead of refusing the choice after they confirm it. Free to call, and cheap enough to refetch whenever a picker opens.","operationId":"list_tables_with_lead_search","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadAttachedTableListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the tables that already have a search","tags":["find-leads"]}},"/find-leads/columns/":{"get":{"description":"The columns a table built from this search type can show, in order, and which of them a preview reveals. Free to call and never fetches a row, so a builder can draw the table header before any preview is bought. A column that no added lead fills is left out when the table is created; a preview, which has leads in hand, lists only the columns they fill. Buying-signal searches take the chosen signal as `signal_type`, which adds the columns that signal's own details earn. Also answers what one row of this search type costs and whether it can be previewed at all, so the price and the preview button are decided by the same free call that draws the header.","operationId":"list_lead_search_columns","parameters":[{"in":"query","name":"record_type","required":true,"schema":{"$ref":"#/components/schemas/LeadRecordType"}},{"description":"For a buying-signal search, the one signal it looks for. Ignored for every other search.","in":"query","name":"signal_type","required":false,"schema":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"For a buying-signal search, the one signal it looks for. Ignored for every other search.","title":"Signal Type"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadColumnPlanResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the columns a search would create","tags":["find-leads"]}},"/find-leads/company-table/":{"get":{"description":"What a column of one of your tables holds right now, read the way a people search following it (`company_table`) reads it: the table's, column's and view's names, how many distinct companies it holds, the first few of them, how many values are company names a search cannot match, and whether it holds more companies than one search can follow. With `check_role`, it also counts the people at each company and lists the companies no one works at (`current`) or once worked at (`past`), each with a company of the same name that does have people, when the table names one. Free to call, and adds nothing; the check takes up to half a minute the first time.","operationId":"get_company_table","parameters":[{"description":"The table holding the companies.","in":"query","name":"table_id","required":true,"schema":{"description":"The table holding the companies.","format":"uuid","title":"Table Id","type":"string"}},{"description":"The column with each company's website, web address, LinkedIn company page or numeric LinkedIn id. A column of company names matches no one.","in":"query","name":"column_id","required":true,"schema":{"description":"The column with each company's website, web address, LinkedIn company page or numeric LinkedIn id. A column of company names matches no one.","format":"uuid","title":"Column Id","type":"string"}},{"description":"A saved view of that table: only the rows its filter keeps are read. Omit it to read every row.","in":"query","name":"view_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A saved view of that table: only the rows its filter keeps are read. Omit it to read every row.","title":"View Id"}},{"description":"Also list the companies no one in the people search works at: `current` counts the job held now, `past` one that ended. Omit it to read the column alone.","in":"query","name":"check_role","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EmployerRole"},{"type":"null"}],"description":"Also list the companies no one in the people search works at: `current` counts the job held now, `past` one that ended. Omit it to read the column alone.","title":"Check Role"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyTableResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The table, the column or the view was deleted."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read a table of companies a people search can follow","tags":["find-leads"]}},"/find-leads/count/":{"post":{"description":"Count the leads matching a set of filters. Free to the customer: no credits are consumed, so it is safe to call as filters change. Buying-signal searches have no live count: they answer with a null total and `supported: false`, and a preview shows what they find.","operationId":"count_leads","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadCountResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderFailureResponseSchema"}}},"description":"The lead database refused the query."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count matching leads","tags":["find-leads"]}},"/find-leads/enrichment-options/":{"get":{"description":"The enrichments a lead import can run, with the exact per-row credit price of each and whether its column already exists in the search's own column plan (`already_covered`); `unavailable_options`, the ones that apply to this search but are not available right now and cannot be chosen; and `row_cost`: what the rows themselves cost before any enrichment. An import's total is `row_cost` plus the chosen options, each counted once. Free to call.","operationId":"list_lead_enrichment_options","parameters":[{"in":"query","name":"record_type","required":true,"schema":{"$ref":"#/components/schemas/LeadRecordType"}},{"in":"query","name":"row_count","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Count"}},{"description":"For a buying-signal search, the one signal it looks for. Ignored for every other search. Read only so `already_covered` also checks that signal's own columns.","in":"query","name":"signal_type","required":false,"schema":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"For a buying-signal search, the one signal it looks for. Ignored for every other search. Read only so `already_covered` also checks that signal's own columns.","title":"Signal Type"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadEnrichmentOptionListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the enrichments offered at import","tags":["find-leads"]}},"/find-leads/geocode/":{"get":{"description":"Resolve one address to the point a radius search would centre on, so a builder can show where it is and how far the radius reaches before anything is searched. Free to call, and answers from a thirty-day cache for an address that has been asked before. An address that matches nothing comes back as a filter complaint against `area`, the same refusal a search would give. Results are Google Maps data: any surface that displays them must credit “Google Maps”.","operationId":"geocode_lead_search_area","parameters":[{"description":"A street address, neighbourhood, postcode or city.","in":"query","name":"address","required":true,"schema":{"description":"A street address, neighbourhood, postcode or city.","maxLength":255,"minLength":1,"title":"Address","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodedAddressResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderFailureResponseSchema"}}},"description":"The address matched nothing, or the geocoder could not be reached."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Find an address on the map","tags":["find-leads"]}},"/find-leads/history/":{"get":{"description":"The searches this workspace actually ran, recorded automatically: previews and imports alike, newest activity first. Re-browsing the same filters refreshes the latest entry rather than duplicating it.","operationId":"list_lead_search_history","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchHistoryListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List recorded lead searches","tags":["find-leads"]}},"/find-leads/history/{entry_id}/":{"delete":{"description":"Hides one recorded search from the caller's own recents. The entry stays in the workspace's history and in every teammate's recents; removing it twice is not an error.","operationId":"remove_lead_search_from_recents","parameters":[{"in":"path","name":"entry_id","required":true,"schema":{"format":"uuid","title":"Entry Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such recorded search."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Remove a search from your recents","tags":["find-leads"]}},"/find-leads/match-values/":{"post":{"description":"Checks a list of pasted or typed values against one of the search builder's closed vocabularies (a department, a seniority, a size band, an industry or a company type) and returns, for each value, its exact match, the closest option, or neither. Read-only: it runs no search and changes nothing.","operationId":"match_lead_values","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchLeadValuesRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchedLeadValuesSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Match pasted values against a closed vocabulary","tags":["find-leads"]}},"/find-leads/preview/":{"post":{"description":"Fetch a preview of at most five of the leads matching a set of filters. The answer is the column plan the table would have plus, for each sample lead, the values of the revealed columns only: a person's name, job title and company, or a company's name. Every other value, email included, stays on the server until the search becomes a table. Unlike counting, retrieving leads is billable upstream, so previews are explicit, never automatic, and capped far below a search. Search types whose rows cost credits offer no preview at all and answer 422: ask `GET /find-leads/columns/` for `preview_supported` before showing the button. The answer also names a table the same search built before, when one still exists.","operationId":"preview_leads","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadPreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"The organisation's plan or credit balance blocks previewing."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderFailureResponseSchema"}}},"description":"The lead database refused the query."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Preview matching leads","tags":["find-leads"]}},"/find-leads/saved-searches/":{"get":{"description":"Saved searches, most recently used first. `scope=mine` restricts the listing to searches the caller saved; the default lists the whole workspace's.","operationId":"list_saved_lead_searches","parameters":[{"in":"query","name":"scope","required":false,"schema":{"default":"workspace","enum":["workspace","mine"],"title":"Scope","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedLeadSearchListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List saved lead searches","tags":["find-leads","mcp-always-include"]},"post":{"description":"Keep a named copy of the current filters for later reuse. Saving runs nothing and costs nothing.","operationId":"save_lead_search","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveLeadSearchRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedLeadSearchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Save a lead search","tags":["find-leads"]}},"/find-leads/saved-searches/{saved_search_id}/":{"delete":{"description":"Remove a saved search. Tables built from it are untouched.","operationId":"delete_saved_lead_search","parameters":[{"in":"path","name":"saved_search_id","required":true,"schema":{"format":"uuid","title":"Saved Search Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved search not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a saved lead search","tags":["find-leads"]}},"/find-leads/saved-searches/{saved_search_id}/use/":{"post":{"description":"Marks the search as just-used so the recents ordering stays honest, and returns it. Runs nothing.","operationId":"touch_saved_lead_search","parameters":[{"in":"path","name":"saved_search_id","required":true,"schema":{"format":"uuid","title":"Saved Search Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedLeadSearchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved search not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Record a saved search being loaded","tags":["find-leads"]}},"/find-leads/signal-types/":{"get":{"description":"Every buying signal a signals search can filter on, filed under the headings the picker groups them by, with the subtypes each one offers. Free to call, and changes only a few times a year.","operationId":"list_lead_signal_types","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSignalTypeListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderFailureResponseSchema"}}},"description":"The signal provider refused the request."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the buying signals a search can look for","tags":["find-leads"]}},"/find-leads/suggest-table-name/":{"post":{"description":"Name the table a lead search would fill after the search itself: the first value of each of its most telling filters, joined with commas in the order the search is said out loud ('C-suite, Software Development, North America, 50-200 employees'). A search with nothing to name it by is called after its rows and today's date in the viewer's time zone ('People, Sep 25, 2026'). Free, runs no search and changes nothing. A table created from a search without a name takes this one, dated in UTC.","operationId":"suggest_lead_table_name","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadTableNameRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestedLeadTableNameSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest a name for a lead search's table","tags":["find-leads"]}},"/find-leads/suggestions/":{"get":{"description":"A few ready-to-load searches, all targeting the given record type. Written from the workspace's business context when it has one (tailored is true); otherwise a standard set every workspace gets (tailored is false). Suggestions are recipes: nothing runs and nothing is spent until one is loaded and acted on. Buying-signal searches are built from their own picker, so they come back with an empty list rather than an error.","operationId":"suggest_lead_searches","parameters":[{"in":"query","name":"record_type","required":true,"schema":{"$ref":"#/components/schemas/LeadRecordType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchSuggestionListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest starter lead searches","tags":["find-leads"]}},"/find-leads/tables/":{"post":{"description":"Run a lead search and land its results in a new table. Each chosen enrichment becomes a column on the new table. A people search may choose none; every other search needs at least one. The row count is capped per search and further clamped by the plan's rows-per-table limit. A table sent without a name is named after the search. A people search leaves out the people already in the workspace's other tables unless `include_people_already_in_tables` is set, and says how many it skipped. The answer also names a table the same search built before, when one still exists.","operationId":"create_table_from_lead_search","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTableFromLeadSearchRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTableFromLeadSearchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Not enough credits to enrich the rows this would land, or the workspace is at its plan's table limit."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Folder not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderFailureResponseSchema"}}},"description":"The lead database refused the query."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a table from a lead search","tags":["find-leads"]}},"/find-leads/tables/{table_id}/search/":{"delete":{"description":"Detach the search from a table, keeping or deleting the rows it produced. Rows are identified by the search's own column, so rows added by other means are never touched.","operationId":"detach_table_search","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"query","name":"delete_rows","required":false,"schema":{"default":false,"title":"Delete Rows","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetachedLeadSearchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"This table has no lead search."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Remove a table's search","tags":["find-leads"]},"get":{"description":"The persisted lead search a table was built from, in the request's own shape, so a builder can rehydrate it. Null for tables built another way.","operationId":"get_table_search","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/LeadSearchSourceResponseSchema"},{"type":"null"}],"title":"Response Get Table Search"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the search behind a table","tags":["find-leads"]},"post":{"description":"Attach a lead search to a table that has none and run it once. Results append beneath the table's existing rows. Enrichments are optional here: the destination table is the user's own and may already carry the columns they want. A people search leaves out the people already in the workspace's other tables unless `include_people_already_in_tables` is set, and says how many it skipped.","operationId":"attach_table_search","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachLeadSearchRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchRunResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Not enough credits to enrich the rows this would land."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderFailureResponseSchema"}}},"description":"The lead database refused the query."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Attach a search to an existing table","tags":["find-leads"]},"put":{"description":"Update a table's persisted search criteria without running them.","operationId":"update_table_search","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableLeadSearchRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchSourceResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"This table has no lead search"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Replace the search behind a table","tags":["find-leads"]}},"/find-leads/tables/{table_id}/search/run/":{"post":{"description":"Re-run the persisted search into the same table. Existing rows are matched on the provider's identifier and update in place; only genuinely new matches add rows. A search saved under filters this API no longer accepts answers 422 against `query`: open it, fix the filters, and save it again.","operationId":"run_table_search","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"description":"The most rows this run may add, and so charge for, however many new matches it finds. Leave it out to add every new match within the search's row limit.","in":"query","name":"max_new_rows","required":false,"schema":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"description":"The most rows this run may add, and so charge for, however many new matches it finds. Leave it out to add every new match within the search's row limit.","title":"Max New Rows"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchRunResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Not enough credits to add the rows this would land."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"This table has no lead search."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderFailureResponseSchema"}}},"description":"The lead database refused the query."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Run a table's search again","tags":["find-leads"]}},"/find-leads/tables/{table_id}/search/runs/":{"get":{"description":"Every recorded execution of the table's search, newest first, including failed ones, with the reason.","operationId":"list_table_search_runs","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchRunLogListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List a table's search runs","tags":["find-leads"]}},"/find-leads/tables/{table_id}/search/schedule/":{"put":{"description":"Schedule the table's search to run on a cadence, or return it to manual runs with a null cadence. The response previews the next three firings.","operationId":"set_table_search_schedule","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchScheduleRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSearchScheduleResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"This table has no lead search."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Set or clear a search's run cadence","tags":["find-leads"]}},"/find-subdomains/searches/":{"post":{"description":"Begin reading the public record of subdomains for a domain. Returns immediately with a pending search; poll the search endpoint until it reaches a terminal status. It usually answers in seconds, but a domain the fast index does not cover falls back to reading raw certificate logs, which is slow and frequently has to be retried. That is why this does not answer inline.","operationId":"start_subdomain_search","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartSubdomainSearchRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdomainSearchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Not enough credits, or the plan does not include subdomain search."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Start a subdomain search","tags":["find-subdomains"]}},"/find-subdomains/searches/{search_id}/":{"get":{"description":"Poll a search until its status is succeeded or failed. A failed search carries an error code and whether another attempt is worth making. With this upstream source, it usually is.","operationId":"get_subdomain_search","parameters":[{"in":"path","name":"search_id","required":true,"schema":{"format":"uuid","title":"Search Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdomainSearchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such subdomain search."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a subdomain search","tags":["find-subdomains"]}},"/find-subdomains/tables/":{"post":{"description":"Land a finished search's hostnames into a new table, one row per hostname. Separate from the search itself so results can be reviewed before a table is committed.","operationId":"create_table_from_subdomain_search","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTableFromSubdomainSearchRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTableFromSubdomainSearchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Not enough credits, or the plan does not allow a table this size."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such subdomain search or folder."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a table from a subdomain search","tags":["find-subdomains"]}},"/google-drive/connect/callback/":{"post":{"description":"Exchanges the OAuth code and stores the grant for the signed-in user.","operationId":"google_drive_connect_callback","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleDriveConnectCallbackSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleDriveConnectionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The OAuth state is invalid or expired."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"Google rejected the token exchange."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Finish connecting Google Drive","tags":["google-drive"]}},"/google-drive/connect/start/":{"post":{"description":"Returns the Google authorize URL; the org and user ride in the OAuth state.","operationId":"start_google_drive_connect","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleDriveConnectStartResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"No Drive client is set up."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Begin connecting Google Drive","tags":["google-drive"]}},"/google-drive/connection/":{"delete":{"description":"Drop the signed-in user's grant. Documents already linked keep their summaries; adding more and refreshing stop working until reconnected.","operationId":"disconnect_google_drive","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Disconnect Google Drive","tags":["google-drive"]},"get":{"description":"Whether the signed-in user has connected Google Drive in this workspace. The grant is per user: drive.file reaches only the files that person picked.","operationId":"get_google_drive_connection","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleDriveConnectionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the Google Drive connection","tags":["google-drive"]}},"/google-drive/picker-token/":{"post":{"description":"A short-lived access token, scoped to drive.file, for the browser to render the Google Picker with, plus the app id and developer key the Picker needs. Mint one per open; never cache it.","operationId":"mint_google_drive_picker_token","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DrivePickerTokenReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Drive is not connected."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"Google rejected the token refresh; the grant is gone."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Mint a Google Picker token","tags":["google-drive"]}},"/helpscout/identity/":{"post":{"description":"Sign the user's email address with the Beacon secure-mode key, and return it with the details the support widget fills its form and conversation with.","operationId":"get_helpscout_identity","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HelpScoutIdentity"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Mint the signed identity the Help Scout Beacon needs","tags":["helpscout"]}},"/inbox-ai/copilot-offer/":{"get":{"description":"True once somebody has pressed Draft with AI several times in a week while the workspace is still set to draft by hand. The count is shown back to that person, so it counts their own drafts rather than the workspace's.","operationId":"get_copilot_offer","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopilotOfferReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Whether to offer Co-pilot in the composer","tags":["inbox-ai"]}},"/inbox-ai/drafts/{draft_id}/":{"patch":{"description":"Change the words that will be sent. What the agent wrote is kept for comparison, and an edit to the agent's reply teaches the agent. Editing a reply the agent has scheduled takes it off the schedule: it waits for a person to approve it instead. Refused once the reply is sending or settled.","operationId":"edit_draft","parameters":[{"in":"path","name":"draft_id","required":true,"schema":{"format":"uuid","title":"Draft Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditDraftSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiDraftReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"This reply is already sending or settled, so it can no longer change."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Edit a draft before approving it","tags":["inbox-ai"]}},"/inbox-ai/drafts/{draft_id}/approve/":{"post":{"description":"Send a reply because a person approved it. It leaves from the mailbox or LinkedIn account the conversation belongs to, and is recorded as sent by that person. Only a reply waiting for approval can be approved; one the agent has scheduled goes out on its own unless it is edited or discarded first.","operationId":"approve_draft","parameters":[{"in":"path","name":"draft_id","required":true,"schema":{"format":"uuid","title":"Draft Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ApproveDraftSchema"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiDraftReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"This reply is not waiting for approval. A reply the agent has scheduled goes out on its own; edit it first to send it yourself."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"424":{"description":"The mailbox or LinkedIn account this thread replies from cannot send."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"The mailbox would not send this reply. The reply still waits."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Approve and send a draft","tags":["inbox-ai"]}},"/inbox-ai/drafts/{draft_id}/discard/":{"post":{"description":"Reject the reply so it is never sent. Also stops a reply the agent has scheduled, up to the moment it starts sending; the agent does not write the same words again for that message. Refused once the reply is sending or settled.","operationId":"discard_draft","parameters":[{"in":"path","name":"draft_id","required":true,"schema":{"format":"uuid","title":"Draft Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"This reply is already sending or settled, so it can no longer change."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Reject a draft","tags":["inbox-ai"]}},"/inbox-ai/drafts/{draft_id}/rate/":{"post":{"description":"Record the human verdict (good or bad) against the draft. Accepted in any status: judging a draft after approving or discarding it is exactly when the verdict is clearest.","operationId":"rate_draft","parameters":[{"in":"path","name":"draft_id","required":true,"schema":{"format":"uuid","title":"Draft Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateDraftSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiDraftReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rate a draft","tags":["inbox-ai"]}},"/inbox-ai/drafts/{draft_id}/regenerate/":{"post":{"description":"Write a fresh reply in place of this one, which is kept so what was written before stays comparable. Works on a reply waiting for approval and on one the agent has scheduled; the new reply always waits for a person. Refused once the reply is sending or settled, including a send that failed: write a fresh reply then. Like Draft with AI, a conversation outside any sequence uses one of the workspace's daily AI Assistant turns. A refusal leaves this reply as it was. Comes back empty when nothing usable was written.","operationId":"regenerate_draft","parameters":[{"in":"path","name":"draft_id","required":true,"schema":{"format":"uuid","title":"Draft Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDraftSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AiDraftReadSchema"},{"type":"null"}],"title":"Response Regenerate Draft"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"This reply is already sending or settled, so it can no longer change; or the conversation's sequence has no audience table, so its agent has nothing to write from."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"description":"The workspace has used today's AI Assistant allowance, or the AI Assistant is paused. Only a conversation outside any sequence uses the allowance."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Try again","tags":["inbox-ai"]}},"/inbox-ai/threads/{thread_id}/complete/":{"post":{"description":"The composer's ghost text. A short plain-text continuation of `draft_text`, built from the conversation on the fast tier. An empty `completion` means the model had nothing useful to add; the composer shows nothing. Logged to the AI usage trail, not yet metered.","operationId":"complete_reply","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteReplySchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyCompletionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Continue the reply being typed","tags":["inbox-ai"]}},"/inbox-ai/threads/{thread_id}/draft/":{"get":{"operationId":"get_pending_draft","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AiDraftReadSchema"},{"type":"null"}],"title":"Response Get Pending Draft"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"The draft waiting on this thread","tags":["inbox-ai"]},"post":{"description":"Write a reply to the conversation's latest message for a person to approve. A conversation from a sequence is answered by that sequence's agent, exactly as it would answer on its own; any other conversation gets a reply in the default voice, which uses one of the workspace's daily AI Assistant turns. Either way the reply waits for a person. `steer_text` is a one-line instruction for this reply. Comes back empty when nothing usable was written, rather than with filler.","operationId":"generate_draft","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDraftSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AiDraftReadSchema"},{"type":"null"}],"title":"Response Generate Draft"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The conversation's sequence has no audience table, so its agent has nothing to write from."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"description":"The workspace has used today's AI Assistant allowance, or the AI Assistant is paused. Only a conversation outside any sequence uses the allowance."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Generate a reply draft","tags":["inbox-ai"]}},"/inbox-ai/threads/{thread_id}/draft/stream/":{"post":{"description":"Draft with AI as a stream of Server-Sent Events. Writes exactly the reply the plain draft route writes, and says what it did on the way: a `step` frame for each piece of work once it is done (reading the conversation, reading the contact's LinkedIn profile when the conversation's agent does, writing the reply), each with its measured duration, then one `result` frame whose `data` is the draft, or null when nothing usable was written.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `not_found` when the conversation is gone, `limit` when the workspace has used today's AI Assistant allowance, `paused` when the AI Assistant is paused, and no reason for anything else, including a sequence with no audience table, whose sentence says so.\n\nClosing the connection does not stop the draft: it is still written and saved.","operationId":"stream_generate_draft","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDraftSchema"}}},"required":true},"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/AiDraftReadSchema","type":"string"}}},"description":"A stream of Server-Sent Events; the final `result` frame's `data` is the draft, or null."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Generate a reply draft, streaming the work","tags":["inbox-ai"]}},"/inbox/ai-settings/":{"get":{"description":"Reply mode, language, tone, the auto-label switch, whether the agent may write and send replies on its own, and the line added to every reply it sends that way.","operationId":"get_inbox_ai_settings","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSettingsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read the workspace AI defaults","tags":["inbox"]},"patch":{"description":"Partial update: only the fields you send change. `labelling_enabled` is the auto-label switch: off means new replies stay unlabeled. `agent_replies_enabled` is the workspace switch for replies the agent writes and may send on its own; turning it off stops them all at once. `ai_disclosure_line` is added below every email reply the agent sends on its own. Needs a signed-in person: an API key cannot change these.","operationId":"update_inbox_ai_settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSettingsUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSettingsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update the workspace AI defaults","tags":["inbox"]}},"/inbox/attachments/{attachment_id}/":{"get":{"description":"The only way attachment bytes leave the private bucket, authenticated.","operationId":"download_attachment","parameters":[{"in":"path","name":"attachment_id","required":true,"schema":{"format":"uuid","title":"Attachment Id","type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{}},"description":"The file."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Download an attachment","tags":["inbox"]}},"/inbox/events/":{"get":{"description":"Server-sent event stream of inbox changes. One coalesced event kind, `inbox_invalidated`, tells the client to refetch what it shows; `hello` on connect means the same thing. The server closes the stream after a few minutes with a `reconnect` frame. Requires Clerk authentication; API keys are rejected.","operationId":"stream_inbox_events","responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/InboxInvalidatedEventSchema","type":"string"}}},"description":"A stream of change events; each frame's `data` is one event."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Stream the inbox's change events","tags":["inbox"]}},"/inbox/labels/":{"get":{"operationId":"list_inbox_labels","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LabelReadSchema"},"title":"Response List Inbox Labels","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List labels","tags":["inbox"]},"post":{"description":"An outcome label: what the conversation MEANT, never a folder.","operationId":"create_inbox_label","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a label","tags":["inbox"]}},"/inbox/labels/{label_id}/":{"delete":{"description":"Threads keep their other labels.","operationId":"delete_inbox_label","parameters":[{"in":"path","name":"label_id","required":true,"schema":{"format":"uuid","title":"Label Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a label","tags":["inbox"]},"patch":{"description":"Rename (seeded labels refuse, because the classifier and the positive rate resolve them by name) and/or set whether the label's threads count into the positive rate.","operationId":"update_inbox_label","parameters":[{"in":"path","name":"label_id","required":true,"schema":{"format":"uuid","title":"Label Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a label","tags":["inbox"]}},"/inbox/saved-views/":{"get":{"description":"The workspace's named filter sets, alphabetically. `filters` carries this endpoint's own thread-list query parameter names, so applying a view means replaying them into `GET /inbox/threads/`. Keys this build does not recognise are dropped server-side, so a view is always applicable.","operationId":"list_inbox_saved_views","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SavedViewReadSchema"},"title":"Response List Inbox Saved Views","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List saved views","tags":["inbox"]},"post":{"description":"Keep a set of inbox filters under a name so a triage session starts in one click. Workspace-wide, not per-user, because a saved view is a way of working a team should be able to share.","operationId":"create_inbox_saved_view","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedViewCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedViewReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Save the current filters as a view","tags":["inbox"]}},"/inbox/saved-views/{view_id}/":{"delete":{"description":"Forgets the filters. The conversations they selected are untouched.","operationId":"delete_inbox_saved_view","parameters":[{"in":"path","name":"view_id","required":true,"schema":{"format":"uuid","title":"View Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a saved view","tags":["inbox"]},"patch":{"description":"Both fields are independent, so renaming and 'make this match what I am looking at now' are the same endpoint without either clobbering the other.","operationId":"update_inbox_saved_view","parameters":[{"in":"path","name":"view_id","required":true,"schema":{"format":"uuid","title":"View Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedViewUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedViewReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rename a saved view or repoint its filters","tags":["inbox"]}},"/inbox/threads/":{"get":{"description":"Newest-first by default, unless `search` is set. Then it is ranked by relevance, most useful match first, and `sort` is ignored. `sort=longest_waiting` reads the same list from the other end, oldest activity first, which is how a reply that has been sitting unanswered for three days gets to the top. Auto-replies and bounces live in their own views; `unlabelled` is the work queue: real threads nobody and no classifier has described yet. `search` runs full-text over every message plus the contact's name and address. `channel` and the `last_message_at__after` / `last_message_at__before` bounds narrow the list; both bounds are inclusive. The working views (`all`, `unlabelled`, `needs_approval`) list only conversations the contact wrote into: a send nobody answered is not in the inbox. `all` and `unlabelled` list only those still waiting on us: a reply with no answer yet, an unread conversation, a reminder that went off, or an answer of ours that went three business days unanswered (`came_back`, `returns_at`) when the verdict on their latest reply does not say the conversation is over. Once we answer, a conversation moves out and stays in `sent`; one marked done (`is_done`) stays out until a new message reaches us. A `search` or a `label_id` reads every conversation the contact wrote into, waiting or not. Each row's `listed_at` is the moment it sorts by. `out_of_office`, `bounces` and `reminders` list what a machine wrote or the person snoozed. `sent` lists every conversation something of ours went out in, a sequence step or a reply, on email or LinkedIn, answered or not and whatever became of it since; a LinkedIn reply still queued for the browser, or one that failed, has not gone out. A send nobody answered never lights the unread badge. Each row's `contact_replied` says whether the contact has written back. `reply_state=replied` keeps the conversations we answered after the contact's latest reply, by a person or the agent; `reply_state=not_replied` keeps the ones whose latest reply is still the last word. `all_mail` lists every conversation, whatever became of it: the place a conversation marked done is found.","operationId":"list_inbox_threads","parameters":[{"in":"query","name":"view","required":false,"schema":{"default":"all","pattern":"^(all|unlabelled|needs_approval|out_of_office|bounces|reminders|sent|all_mail)$","title":"View","type":"string"}},{"in":"query","name":"unread_only","required":false,"schema":{"default":false,"title":"Unread Only","type":"boolean"}},{"in":"query","name":"reply_state","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ReplyState"},{"type":"null"}],"title":"Reply State"}},{"in":"query","name":"sequence_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sequence Id"}},{"in":"query","name":"mailbox_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Mailbox Id"}},{"in":"query","name":"sender_profile_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sender Profile Id"}},{"in":"query","name":"sequence_id__not","required":false,"schema":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array"},{"type":"null"}],"title":"Sequence Id  Not"}},{"in":"query","name":"mailbox_id__not","required":false,"schema":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array"},{"type":"null"}],"title":"Mailbox Id  Not"}},{"in":"query","name":"sender_profile_id__not","required":false,"schema":{"anyOf":[{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array"},{"type":"null"}],"title":"Sender Profile Id  Not"}},{"in":"query","name":"label_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Label Id"}},{"in":"query","name":"channel","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/InboxChannel"},{"type":"null"}],"title":"Channel"}},{"in":"query","name":"last_message_at__after","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Message At  After"}},{"in":"query","name":"last_message_at__before","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Message At  Before"}},{"in":"query","name":"sort","required":false,"schema":{"$ref":"#/components/schemas/ThreadSort","default":"newest"}},{"in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Search"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadListReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List inbox threads","tags":["inbox"]}},"/inbox/threads/bulk-delete/":{"post":{"description":"The bulk form of deleting one thread. Contacts, their enrolments and the do-not-contact list are untouched, so a new reply starts a fresh conversation. Stale ids are silently absent from the count.","operationId":"bulk_delete_threads","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkThreadIdsSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete many threads","tags":["inbox"]}},"/inbox/threads/bulk-do-not-contact/":{"post":{"description":"The bulk form of do-not-contact on one thread: every selected contact suppressed, every cadence stopped, every selected conversation marked done.","operationId":"bulk_do_not_contact","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkThreadIdsSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DoNotContactResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suppress many threads' contacts at once","tags":["inbox"]}},"/inbox/threads/bulk-done/":{"post":{"description":"The bulk form of marking one conversation done. Ids that no longer exist are silently absent from the count, because a selection can go stale under the user between choosing and clicking.","operationId":"bulk_set_done","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDoneUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkReadResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Mark many conversations done, or not","tags":["inbox"]}},"/inbox/threads/bulk-label/":{"post":{"operationId":"bulk_add_label","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkLabelUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkReadResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Put one label on many threads","tags":["inbox"]}},"/inbox/threads/bulk-read/":{"post":{"operationId":"bulk_set_read","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkReadUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkReadResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Mark many threads read or unread","tags":["inbox"]}},"/inbox/threads/bulk-snooze/":{"post":{"description":"The bulk form of snoozing one thread, a done mark taken off with it. A null `snoozed_until` cancels the snooze on every selected thread. Ids that no longer exist are silently absent from the count rather than failing the batch, because a selection can go stale under the user between choosing and clicking.","operationId":"bulk_snooze_threads","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSnoozeSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkReadResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Snooze many threads, or wake them","tags":["inbox"]}},"/inbox/threads/unread-count/":{"get":{"description":"The navigation badge: unread threads outside the OOO/bounce views.","operationId":"get_unread_count","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCountReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Unread thread count","tags":["inbox"]}},"/inbox/threads/{thread_id}/":{"delete":{"description":"Removes the conversation and its messages from Oneprofile. The contact, their sequence enrolments, and the do-not-contact list are untouched, so a new reply starts a fresh conversation. Attachment bytes stay in the private bucket as a deliberate trade-off: their rows cascade away, the bucket is never publicly readable, and no private-bucket delete helper exists.","operationId":"delete_inbox_thread","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a thread","tags":["inbox"]},"get":{"operationId":"get_inbox_thread","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get one thread","tags":["inbox"]}},"/inbox/threads/{thread_id}/do-not-contact/":{"post":{"description":"One click: the do-not-contact entry and every cadence stop, together, and the conversation marked done so it leaves the Inbox for All mail.","operationId":"mark_thread_do_not_contact","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DoNotContactResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suppress this contact and stop their sequences","tags":["inbox"]}},"/inbox/threads/{thread_id}/do-not-contact/impact/":{"get":{"description":"The confirm dialog names them before the click, not after.","operationId":"get_do_not_contact_impact","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DoNotContactImpactReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Which sequences a do-not-contact would stop","tags":["inbox"]}},"/inbox/threads/{thread_id}/done/":{"post":{"description":"Done takes the conversation out of the Inbox until a new message reaches us, theirs or ours: their reply brings it back, and so does an answer of ours that then goes three business days unanswered. An auto-reply, a bounce or a forward does not. It also cancels a reminder the conversation is waiting on. False clears the mark, and the Inbox's own rule decides again whether it is listed.","operationId":"set_inbox_thread_done","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadDoneUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Mark a conversation done, or not","tags":["inbox"]}},"/inbox/threads/{thread_id}/labels/":{"put":{"operationId":"put_thread_labels","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadLabelsPutSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Assign exactly this set of labels to a thread","tags":["inbox"]}},"/inbox/threads/{thread_id}/messages/":{"get":{"operationId":"list_inbox_messages","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageListReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"A thread's messages, oldest-first","tags":["inbox"]}},"/inbox/threads/{thread_id}/messages/{message_id}/forward/":{"post":{"description":"Sends one message of the thread onward with a note, as a NEW email carrying no threading headers, because a colleague's answer must never land in the prospect's conversation. The original's attachments ride along. Recorded on the thread for the record, but the conversation's last activity is left alone.","operationId":"forward_message","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}},{"in":"path","name":"message_id","required":true,"schema":{"format":"uuid","title":"Message Id","type":"string"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_forward_message"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"The mailbox could not send."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Forward a message to somebody else","tags":["inbox"]}},"/inbox/threads/{thread_id}/read/":{"post":{"operationId":"set_thread_read","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadReadFlagUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Mark a thread read or unread","tags":["inbox"]}},"/inbox/threads/{thread_id}/reply/":{"post":{"description":"Sends from the mailbox that owns the conversation, so the prospect always sees a reply from the address that emailed them. Free of credits. Attachments ride on the email (multipart form). `channel` overrides which channel the reply goes out on when both identities are known; absent, the thread's own channel decides. A pick the thread cannot honour returns 422 with the reason. `to` redirects the reply (first address is the To line, the rest ride as CC) and `bcc` rides blind; both are email-only. `omit_signature` skips the mailbox signature append, for a composer whose body already carries it as visible text.","operationId":"reply_in_thread","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_reply_in_thread"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"The mailbox could not send."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Reply in a thread","tags":["inbox"]}},"/inbox/threads/{thread_id}/snooze/":{"post":{"description":"Hide the thread from the working views until the given instant; it lives in the `reminders` view meanwhile and simply reappears when the time passes. A reminder also takes off a done mark, so the conversation does come back. Null cancels, and leaves a done mark as it is.","operationId":"snooze_inbox_thread","parameters":[{"in":"path","name":"thread_id","required":true,"schema":{"format":"uuid","title":"Thread Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadSnoozeSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Snooze or unsnooze a thread","tags":["inbox"]}},"/integration/":{"delete":{"description":"Delete multiple integrations by their IDs. Max 100 IDs per request.","operationId":"bulk_delete_integrations","parameters":[{"description":"IDs of integrations to delete","in":"query","name":"ids","required":true,"schema":{"description":"IDs of integrations to delete","items":{"format":"uuid","type":"string"},"maxItems":100,"minItems":1,"title":"Ids","type":"array"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Bulk delete integrations","tags":["integrations"]},"get":{"description":"List all integrations created for the organization. Responses are paginated.","operationId":"list_integrations","parameters":[{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListIntegrationsFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtNameCreatedByDisplayName","default":"id","enum":["id","created_at","updated_at","name","created_by_display_name"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"asc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}},{"description":"Sort worst configuration health to the top, with order_by as the secondary within-group sort. Disable to sort purely by order_by.","in":"query","name":"health_first","required":false,"schema":{"default":true,"description":"Sort worst configuration health to the top, with order_by as the secondary within-group sort. Disable to sort purely by order_by.","title":"Health First","type":"boolean"}},{"description":"With health_first, which end of the health order comes first: worst_first (errors on top, the default) or best_first.","in":"query","name":"health_order","required":false,"schema":{"default":"worst_first","description":"With health_first, which end of the health order comes first: worst_first (errors on top, the default) or best_first.","enum":["worst_first","best_first"],"title":"Health Order","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_IntegrationRead_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List all integrations","tags":["integrations","mcp-always-include"]}},"/integration/category/":{"get":{"description":"List all available integration categories with their descriptions.","operationId":"list_integration_categories","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List integration categories","tags":["integration-types"]}},"/integration/health-checks/":{"post":{"description":"Trigger background health checks for a selection of integrations. The selection is either an explicit ID list or a filter-based select-all that genuinely spans every page (past the per-page cap). Checks run asynchronously in the background (they complete even if the user navigates away) and progress can be polled via the summary endpoint.","operationId":"trigger_health_checks","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkHealthCheckSelectionSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthChecksTriggeredResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Bulk trigger health checks","tags":["integrations"]}},"/integration/health-checks/summary/":{"post":{"description":"Return live progress and a consolidated, status-grouped summary for a bulk health check run over the same selection that was triggered. An integration counts as checked once its latest health check is newer than the provided run start time. Poll this until checked == total, then render the grouped summary and links to the failures.","operationId":"get_health_checks_summary","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckSummaryRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckSummaryResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Bulk health check progress and summary","tags":["integrations"]}},"/integration/length/":{"get":{"description":"Get the number of integrations for the organization.","operationId":"count_integrations","parameters":[{"description":"Filter by integration kind (source, destination, or both)","in":"query","name":"kind","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/IntegrationKindFilter"},{"type":"null"}],"description":"Filter by integration kind (source, destination, or both)","title":"Kind"}},{"description":"Exclude integrations with these integration types","in":"query","name":"integration_type__not","required":false,"schema":{"anyOf":[{"items":{"maxLength":255,"type":"string"},"maxItems":50,"type":"array"},{"type":"null"}],"description":"Exclude integrations with these integration types","title":"Integration Type  Not"}},{"description":"Filter to integrations that handle any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.","in":"query","name":"record_type__in","required":false,"schema":{"anyOf":[{"items":{"maxLength":255,"type":"string"},"maxItems":50,"type":"array"},{"type":"null"}],"description":"Filter to integrations that handle any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.","title":"Record Type  In"}},{"description":"Search integrations by name or type. Multi-word queries use AND logic.","in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Search integrations by name or type. Multi-word queries use AND logic.","title":"Search"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationCount"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the number of integrations","tags":["integrations"]}},"/integration/record-type/":{"get":{"description":"List the global vocabulary of record types across all integrations, as display-ready options for the record-type filter on the integrations list and the directory. Includes a single 'Custom' entry when any integration accepts arbitrary record types.","operationId":"list_record_type_vocabulary","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordTypeVocabularyResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the record-type vocabulary","tags":["integration-types"]}},"/integration/suggest-name/":{"get":{"description":"Suggest a unique integration name for a given integration type. Returns a name in the format '{integration_type}' or '{integration_type} (N)' if the base name is already taken.","operationId":"suggest_integration_name","parameters":[{"description":"The type of integration (e.g., 'google_sheets')","in":"query","name":"integration_type","required":true,"schema":{"description":"The type of integration (e.g., 'google_sheets')","maxLength":255,"minLength":1,"title":"Integration Type","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestedIntegrationName"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest an integration name","tags":["integrations"]}},"/integration/type/":{"get":{"description":"List all available integration types with their categories, display names and descriptions. Supports search, category, and kind filtering.","operationId":"list_integration_types","parameters":[{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListIntegrationTypesFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtName","default":"name","enum":["id","created_at","updated_at","name"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"asc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_IntegrationTypeRead_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List all available integration types","tags":["integration-types"]}},"/integration/type/{name}/":{"get":{"description":"Get detailed information about a specific integration type by its name. Returns the integration type's categories, display name, description, and configuration schemas.","operationId":"get_integration_type","parameters":[{"in":"path","name":"name","required":true,"schema":{"maxLength":255,"minLength":1,"title":"Name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationTypeRead"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration type not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a specific integration type","tags":["integration-types"]}},"/integration/type/{name}/guide/":{"get":{"description":"Get the setup guide for a specific integration type. Returns the full guide content as markdown with step-by-step instructions for obtaining credentials and configuring the integration.","operationId":"get_integration_type_guide","parameters":[{"in":"path","name":"name","required":true,"schema":{"maxLength":255,"minLength":1,"title":"Name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationTypeGuideReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No guide found for this integration type"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get setup guide for an integration type","tags":["integration-types"]}},"/integration/{integration_id}/":{"delete":{"description":"Delete an integration by its ID.","operationId":"delete_integration","parameters":[{"in":"path","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete an integration","tags":["integrations"]},"get":{"description":"Get an integration by its ID.","operationId":"get_integration","parameters":[{"in":"path","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRead"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get an integration","tags":["integrations"]}},"/integration/{integration_id}/audit-logs/":{"get":{"description":"List the configuration change history for an integration (created, updated, deleted), ordered by creation time. Credential changes are recorded without their values.","operationId":"list_integration_audit_logs","parameters":[{"in":"path","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForCreatedAt","default":"created_at","enum":["created_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_IntegrationAuditLogReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List audit logs for an integration","tags":["integrations"]}},"/integration/{integration_id}/health-check/":{"post":{"description":"Manually trigger a health check for an integration.","operationId":"trigger_health_check","parameters":[{"in":"path","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Trigger a health check","tags":["integrations"]}},"/integration/{integration_id}/health-checks/":{"get":{"description":"List recent health check results for an integration, newest first.","operationId":"list_health_checks","parameters":[{"in":"path","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForCheckedAt","default":"checked_at","enum":["checked_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_HealthCheckReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List health check history","tags":["integrations"]}},"/integration/{integration_id}/properties/":{"get":{"description":"List the property names the integration exposes for a record type, read live from the integration's API. Supports optional search filtering by property name.","operationId":"list_integration_properties","parameters":[{"in":"path","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}},{"description":"Record type to list properties for (e.g., 'person', 'contact')","in":"query","name":"record_type","required":true,"schema":{"description":"Record type to list properties for (e.g., 'person', 'contact')","maxLength":255,"minLength":1,"title":"Record Type","type":"string"}},{"description":"Filter by property kind (builtin or custom)","in":"query","name":"kind","required":true,"schema":{"$ref":"#/components/schemas/PropertyKind","description":"Filter by property kind (builtin or custom)"}},{"description":"Search properties by name (case-insensitive)","in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Search properties by name (case-insensitive)","title":"Search"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List all known properties for an integration","tags":["integrations"]}},"/integration/{integration_id}/record_types/":{"get":{"description":"Get the record types for an integration, split into builtin (statically-known, e.g. 'customer', 'product') and custom (created on the integration side and discovered via its API, e.g. Attio custom objects or database tables). Record types represent the object types that can be synced. The internal wildcard ('*') is never included.","operationId":"list_integration_record_types","parameters":[{"in":"path","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordTypesResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List record types for an integration","tags":["integrations"]}},"/linkedin/agent/actions/next/":{"post":{"description":"Hands out one action, if and only if the governor allows it: the account is active and not at a checkpoint, no other step is running, the last one was handed out long enough ago, the kind still has daily headroom, the rolling weekly invitation ceiling is not reached, and credit covers it. A step the Oneprofile team fired to test the sender goes first and waits for none of those but the first two; asked with `unmetered_only`, only such a step is handed out. A step whose browser stopped reporting is resolved first. When nothing is handed out the response says why, which is what lets the panel distinguish an empty queue from a paced one: `in_flight`, `pacing` (with when to ask again), `daily_cap` or `weekly_cap` (only while claimable work waits behind them), `checkpoint`, `not_connected`, `insufficient_credits`, or null for an empty queue.","operationId":"linkedin_agent_pull_next","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentNextRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentNextActionSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Claim the next permitted action","tags":["linkedin"]}},"/linkedin/agent/actions/{action_id}/attempts/":{"post":{"description":"Sent instead of a result by a build that reports attempts (attempts:v1) when a run of the step it holds was cut off without an error from LinkedIn: a person closed the working tab, the extension restarted, a page never loaded, the tab froze, the identity page never answered, LinkedIn never answered a press, or the server could not be asked. The server records the attempt, counts it against the step unless a person closed the tab or the server could not be asked, and answers with what to do: retry (run it again as next_run_id), look_first (run it again, looking on LinkedIn before any press), stop (it was cut off too often and is settled failed; post nothing), lost (the claim is not this browser's any more; post nothing) or not_retryable (not an interruption, or a press LinkedIn never answered or a page that never drew at the cap; post the result). When the step goes on, the press fence moves to the next run and the claim's lease is extended. The same report again (the same stopped run) gets the same answer and changes nothing.","operationId":"linkedin_agent_report_attempt","parameters":[{"in":"path","name":"action_id","required":true,"schema":{"format":"uuid","title":"Action Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAttemptSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAttemptAnswerSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such action on the account this token is bound to."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Report a run of a step that was cut off, and ask what to do with the step","tags":["linkedin"]}},"/linkedin/agent/actions/{action_id}/commit/":{"post":{"description":"Asked by a build that resumes steps (resume:v1) right before every press that sends, follows, likes or withdraws. Granted only to the claim named, still this browser's, inside its lease, and to one run of it at a time; the lease moves on with the grant. The grant is the server's record that the step may have happened: no grant, nothing happened. A paused sequence or a closed sending window does not refuse it, because a step already running may finish. A step held into a new day whose limit is spent is refused with requeue_at_reset and waits for the reset; it never fails for it. A message not pressed yet while its sender's inbox goes unread, or its member's reply waits to be read, is refused with wait_for_replies and goes back in line.","operationId":"linkedin_agent_commit","parameters":[{"in":"path","name":"action_id","required":true,"schema":{"format":"uuid","title":"Action Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentCommitSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentCommitGrantSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such action on the account this token is bound to."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Ask to press the control that changes LinkedIn","tags":["linkedin"]}},"/linkedin/agent/actions/{action_id}/diagnostic/":{"post":{"description":"The heavy half of a page report, posted after the step's result has landed: the structure of the part of LinkedIn's page the browser was reading (tags, a few attributes, icon names, text lengths, never text) and how many elements each selector candidate matched there. Cleaned again on arrival and kept only when it adds evidence. Never refused for its content, so a report can never cost a result.","operationId":"linkedin_agent_post_diagnostic","parameters":[{"in":"path","name":"action_id","required":true,"schema":{"format":"uuid","title":"Action Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Snapshot","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentDiagnosticStoredSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Attach a page snapshot to a step's report","tags":["linkedin"]}},"/linkedin/agent/actions/{action_id}/reject/":{"post":{"description":"The side panel's Skip this one: the person watching passes over the step, which is taken out of the line, or stopped if a browser is running it. Never charged; a running step may have partly happened, so it still counts against the day's limit and its history says so. A sequence's contact moves on past the step. A step that already finished is refused. The reason a build sends is not read.","operationId":"linkedin_agent_reject","parameters":[{"in":"path","name":"action_id","required":true,"schema":{"format":"uuid","title":"Action Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRejectSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInActionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such action on the account this token is bound to."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The step already finished."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Skip a step from the side panel","tags":["linkedin"]}},"/linkedin/agent/actions/{action_id}/release/":{"post":{"description":"For a step this browser cannot go on with here: it looked and found the step not done but may not finish it now, the person closed the working tab again, no window is open, or the page stopped under it. A step that may have touched LinkedIn goes back to be looked at again; any other goes back to the line, giving back its daily unit and its credit hold. Only `interrupted` counts against the step, and the fourth time fails it for a person to retry. A step no longer claimed by this browser is refused with 409.","operationId":"linkedin_agent_release","parameters":[{"in":"path","name":"action_id","required":true,"schema":{"format":"uuid","title":"Action Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentReleaseSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInActionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such action on the account this token is bound to."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The step is not this browser's."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Hand back a running step without settling it","tags":["linkedin"]}},"/linkedin/agent/actions/{action_id}/result/":{"post":{"description":"Settles an action the browser has finished with. Only a step that is still running settles, so a flaky connection can never double-charge: a report for a step already settled, cancelled or skipped in the side panel, or given up on after its browser stopped reporting is refused with 409 and changes nothing. Any non-success returns both the daily budget unit and the credit hold. A failed sequence step stops its contact at that step until a person retries it.","operationId":"linkedin_agent_post_result","parameters":[{"in":"path","name":"action_id","required":true,"schema":{"format":"uuid","title":"Action Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResultSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInActionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No such action on the account this token is bound to."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The step was already settled."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The outcome is not a member of the catalogue, or is tagged with a different kind than the action it settles."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Report an action's outcome","tags":["linkedin"]}},"/linkedin/agent/config/":{"get":{"description":"Serves the versioned document of CSS selectors, URL patterns, bootstrap type names and pacing the extension runs on. It carries data only, never code, so a LinkedIn markup change becomes a backend deploy rather than a Web Store submission. The extension validates the payload against its compiled-in fallback before trusting it, so a malformed field degrades to that fallback.","operationId":"linkedin_agent_config","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Linkedin Agent Config","type":"object"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Fetch the remote selector and pacing config","tags":["linkedin"]}},"/linkedin/agent/disconnect/":{"post":{"description":"Identical to disconnecting from the dashboard: every browser is signed out, work stops, history stays, and the connection token is replaced. Called BEFORE the extension wipes its own state, so a disconnect from the panel can never leave a live session behind on the server.","operationId":"linkedin_agent_disconnect","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Disconnect the account from the side panel","tags":["linkedin"]}},"/linkedin/agent/heartbeat/":{"post":{"description":"Records that a browser is alive, renews its exclusive lease on the account, and returns the run state the extension must obey, which is how a change made in the web app (the sender's approval setting, a limit) reaches the browser without a push channel. Also carries the wrong-account guard: if the browser is signed in as somebody other than the bound member, the response says so and the extension must stop. A reported checkpoint is applied only from the browser holding the lease; a browser that does not hold it is told which browser does. While work is queued it also says what the next step waits on and until when, and asks for check-ins at most 15 seconds apart while work is about to run. It says how many of the sender's steps wait for a person on Tasks, less those a paused sequence or paused contact holds, and whether a step that waits for no gap is ready.","operationId":"linkedin_agent_heartbeat","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentHeartbeatSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentStateSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Report liveness and read the authoritative run state","tags":["linkedin"]}},"/linkedin/agent/history/":{"post":{"description":"Settled actions newest first with lifetime stats: the dashboard's history, verbatim.","operationId":"linkedin_agent_history","parameters":[{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInHistoryPageSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"List completed steps, for the side panel","tags":["linkedin"]}},"/linkedin/agent/pair/":{"post":{"description":"The only unauthenticated route in this package: the connection token a person pasted IS the credential, and the sender it names was fixed server-side when the token was minted, so nothing the extension sends can redirect it. Every browser that connects gets its own agent token. A connected sender accepts only the LinkedIn member it is bound to; a disconnected or never-connected sender takes whoever connects. One LinkedIn member is connected to at most one sender. A browser pairing again passes its previous session so that one is signed out.","operationId":"linkedin_agent_pair","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPairSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPairResultSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The connection token is invalid, or the sender is connected as another member."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"This LinkedIn member is already connected to another sender."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"summary":"Connect a browser with a sender's connection token","tags":["linkedin"]}},"/linkedin/agent/queue/":{"post":{"description":"The same rows, in the same order, the dashboard's queue shows, less the waiting steps a paused sequence or paused contact holds: those are no browser's work until they are resumed. A step is queued only once it may run, so every row reads approved the moment it was queued: a step waiting for a person waits on Tasks, never here.","operationId":"linkedin_agent_queue","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LinkedInActionReadSchema"},"title":"Response Linkedin Agent Queue","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"List the queue, for the side panel","tags":["linkedin"]}},"/linkedin/agent/state/":{"post":{"description":"Writes the sender's LinkedIn approval setting (`run_mode`), the same setting the sender's LinkedIn page writes, so the two surfaces have one source of truth rather than two that drift. An empty body reads the state without changing it. With a lease nonce, the answer also says whether this browser holds the lease, and which browser does when it does not.","operationId":"linkedin_agent_set_state","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSetStateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentStateSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"The agent token is invalid, revoked, or expired."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]}],"summary":"Set the sender's approval setting from the extension","tags":["linkedin"]}},"/mailboxes/":{"delete":{"description":"Delete the selection in one statement. Ids that no longer exist are skipped rather than failing the request, so a stale selection still removes everything it can. `count` reports what actually went.","operationId":"bulk_delete_mailboxes","parameters":[{"description":"Mailboxes to delete","in":"query","name":"ids","required":true,"schema":{"description":"Mailboxes to delete","items":{"format":"uuid","type":"string"},"maxItems":500,"title":"Ids","type":"array"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete many mailboxes","tags":["senders"]},"get":{"description":"The ops list and the profile editor's picker share this endpoint. Two status filters, and they read differently on purpose: `connection_status` is the stored grant state, where `connected` means anything that is not broken; `health` is the three-way split the Status column draws, where `verified` is a grant that passed its latest check (one runs every hour) and `connected` narrows to one that has not passed a check yet, or whose latest check got a definite error back that was not a refusal.","operationId":"list_mailboxes","parameters":[{"in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":320,"type":"string"},{"type":"null"}],"title":"Search"}},{"in":"query","name":"connection_status","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/MailboxConnectionStatus"},{"type":"null"}],"title":"Connection Status"}},{"in":"query","name":"health","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/MailboxHealth"},{"type":"null"}],"title":"Health"}},{"in":"query","name":"provider","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/MailboxProvider"},{"type":"null"}],"title":"Provider"}},{"in":"query","name":"sender_profile_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sender Profile Id"}},{"in":"query","name":"sent_on","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SentOn"},{"type":"null"}],"title":"Sent On"}},{"description":"The column to order by. `connection_status` orders by the Status column's three states, disconnected first, then connected, then verified; `sender_profile_id` by the sender's name, with unassigned mailboxes last. Ties go by address. Leave empty for disconnected first, then by address.","in":"query","name":"sort","required":false,"schema":{"anyOf":[{"pattern":"^(email_address|display_name|provider|connection_status|sender_profile_id)$","type":"string"},{"type":"null"}],"description":"The column to order by. `connection_status` orders by the Status column's three states, disconnected first, then connected, then verified; `sender_profile_id` by the sender's name, with unassigned mailboxes last. Ties go by address. Leave empty for disconnected first, then by address.","title":"Sort"}},{"in":"query","name":"order","required":false,"schema":{"default":"asc","pattern":"^(asc|desc)$","title":"Order","type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxPageSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List mailboxes","tags":["senders"]}},"/mailboxes/bulk/":{"patch":{"description":"The daily send limit and sender-profile assignment across the selection. Omitted fields are left unchanged everywhere: 'leave unchanged' and 'set to empty' are different requests.","operationId":"bulk_update_mailboxes","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxBulkUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxBulkUpdateResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Edit many mailboxes at once","tags":["senders"]}},"/mailboxes/connect/google/callback/":{"post":{"description":"Exchanges the OAuth code and creates (or reconnects) the mailbox.","operationId":"google_connect_callback","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleConnectCallbackSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"The person did not grant send and read access."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The OAuth state is invalid or expired."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"Google rejected the token exchange."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Finish connecting a Google Workspace mailbox","tags":["senders"]}},"/mailboxes/connect/google/start/":{"post":{"description":"Returns the Google authorize URL; the org rides in the OAuth state.","operationId":"start_google_connect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleConnectStartSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleConnectStartResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Begin connecting a Google Workspace mailbox","tags":["senders"]}},"/mailboxes/inboxkit/connect/":{"post":{"description":"Stores the API key scoped to one workspace the key can act on.","operationId":"connect_inboxkit","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitConnectSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitConnectionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"InboxKit rejected the API key."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"InboxKit could not be reached."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Connect InboxKit","tags":["senders"]}},"/mailboxes/inboxkit/connect/preview/":{"post":{"description":"Nothing is stored; the workspaces feed the connect picker.","operationId":"preview_inboxkit_connect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitConnectPreviewSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitConnectPreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"InboxKit rejected the API key."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"InboxKit could not be reached."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Validate an InboxKit API key and list its workspaces","tags":["senders"]}},"/mailboxes/inboxkit/connection/":{"delete":{"description":"Imported mailboxes keep working; the presence poll stops covering them.","operationId":"disconnect_inboxkit","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Disconnect InboxKit","tags":["senders"]},"get":{"description":"Always 200: not-connected is a state the UI branches on, not an error.","operationId":"get_inboxkit_connection","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitConnectionStatusSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the InboxKit connection state","tags":["senders"]},"patch":{"description":"Toggles for the hourly sweep: auto-import new inboxes, auto-disconnect missing ones.","operationId":"update_inboxkit_connection","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitConnectionUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitConnectionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update InboxKit automation settings","tags":["senders"]}},"/mailboxes/inboxkit/domains/":{"get":{"description":"The authorization progress surface: per-domain status and failure reasons.","operationId":"list_inboxkit_domains","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitDomainsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List domain delegation states","tags":["senders"]}},"/mailboxes/inboxkit/import/":{"post":{"description":"Mailboxes on authorized domains connect immediately; other domains start the async delegation handshake and import on completion.","operationId":"import_inboxkit_mailboxes","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitImportSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitImportResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"InboxKit rejected the API key."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"InboxKit could not be reached."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Import selected InboxKit mailboxes","tags":["senders"]}},"/mailboxes/inboxkit/imports/":{"get":{"description":"The import history: every request, who triggered it, and its per-mailbox counts.","operationId":"list_inboxkit_imports","parameters":[{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAtStartedAt","default":"started_at","enum":["id","created_at","started_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_InboxkitImportRunReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List InboxKit import runs","tags":["senders"]}},"/mailboxes/inboxkit/imports/{run_id}/":{"get":{"description":"The run plus every requested mailbox and its outcome, failure reasons included.","operationId":"get_inboxkit_import","parameters":[{"in":"path","name":"run_id","required":true,"schema":{"format":"uuid","title":"Run Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitImportRunDetailReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get one InboxKit import run","tags":["senders"]}},"/mailboxes/inboxkit/inventory/":{"get":{"description":"Every InboxKit domain and mailbox, merged with delegation state and which mailboxes are already connected here, marked imported: the import picker's data. A mailbox imported before and disconnected since is not marked, so it can be imported again.","operationId":"get_inboxkit_inventory","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitInventoryResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"InboxKit rejected the API key."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"InboxKit could not be reached."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the org's InboxKit inventory","tags":["senders"]}},"/mailboxes/inboxkit/remove-everything/":{"post":{"description":"The full-removal path: delegation records and the connection go; the imported mailboxes are disconnected or deleted per the request.","operationId":"remove_inboxkit_everything","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitRemoveEverythingSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxkitRemovalResultReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Remove InboxKit and its imported mailboxes","tags":["senders"]}},"/mailboxes/overview/":{"get":{"description":"Fleet size, health split, volume today/yesterday, and the workspace capacity left today.","operationId":"get_mailbox_overview","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxOverviewReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Mailbox overview tiles","tags":["senders"]}},"/mailboxes/refresh-status/":{"post":{"description":"Re-checks the given mailboxes, or every mailbox when no body is sent, with the hourly check's own probe: a read of each account's profile, which sends no email. Each mailbox that passes is stamped last_verified_at, as the hourly check stamps it, and one whose grant is refused is marked disconnected with the reason. A mailbox Google could not answer for keeps the status it had, and one Gmail answered with a definite error (Gmail turned off for that user, say) loses its stamp until a check passes. A mailbox disconnected on purpose, such as one removed from InboxKit, is not checked.","operationId":"refresh_mailbox_status","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RefreshMailboxStatusSchema"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MailboxReadSchema"},"title":"Response Refresh Mailbox Status","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Re-check mailbox connections now","tags":["senders"]}},"/mailboxes/removal-impact/":{"get":{"description":"Before deleting mailboxes, taking them off their sender or moving them to another sender: how many live contacts it stops or leaves waiting, per sequence. A contact is only ever emailed from the mailbox that first emailed them, so a deleted mailbox stops them, an unassigned one makes them wait, and a move stops them in sequences the new sender is not on. Changes nothing.","operationId":"get_mailbox_removal_impact","parameters":[{"description":"The mailboxes","in":"query","name":"ids","required":true,"schema":{"description":"The mailboxes","items":{"format":"uuid","type":"string"},"maxItems":500,"minItems":1,"title":"Ids","type":"array"}},{"description":"What is about to happen","in":"query","name":"action","required":true,"schema":{"$ref":"#/components/schemas/MailboxImpactAction","description":"What is about to happen"}},{"description":"The sender a move puts them on","in":"query","name":"move_to_sender_profile_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The sender a move puts them on","title":"Move To Sender Profile Id"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxRemovalImpactReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count who removing mailboxes reaches","tags":["senders"]}},"/mailboxes/{mailbox_id}/":{"delete":{"operationId":"delete_mailbox","parameters":[{"in":"path","name":"mailbox_id","required":true,"schema":{"format":"uuid","title":"Mailbox Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a mailbox","tags":["senders"]},"get":{"operationId":"get_mailbox","parameters":[{"in":"path","name":"mailbox_id","required":true,"schema":{"format":"uuid","title":"Mailbox Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a mailbox","tags":["senders"]},"patch":{"description":"A mailbox's own settings: its daily send limit and which sender it sends as. Name and signature live on the sender.","operationId":"update_mailbox","parameters":[{"in":"path","name":"mailbox_id","required":true,"schema":{"format":"uuid","title":"Mailbox Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a mailbox","tags":["senders"]}},"/mailboxes/{mailbox_id}/activity/":{"get":{"description":"The detail page's chart: zero-filled per day, three disjoint counts. `days` scopes EVERY panel (chart, recipient domains, bounces); 365 is the 'all' the UI offers.","operationId":"get_mailbox_activity","parameters":[{"in":"path","name":"mailbox_id","required":true,"schema":{"format":"uuid","title":"Mailbox Id","type":"string"}},{"in":"query","name":"days","required":false,"schema":{"default":14,"maximum":365,"minimum":1,"title":"Days","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxActivityReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"A mailbox's recent sends, replies and bounces","tags":["senders"]}},"/mailboxes/{mailbox_id}/verify/":{"post":{"description":"Checks that a mailbox's connection to Google still works by reading the account's own profile, refreshing the access token first if it needs it. Sends no email. A mailbox that passes is stamped last_verified_at, as the hourly check and a status refresh stamp it. A refused grant disconnects the mailbox, and the refusal carries the reason stored on it; so does a mailbox disconnected on purpose, which is not checked. A definite error Gmail answers with (Gmail turned off for that user, say) fails the check and clears the stamp, but leaves the mailbox connected. When Google cannot answer just now (no answer, a server error or a timeout), nothing is checked and the mailbox keeps the status it had.","operationId":"verify_mailbox","parameters":[{"in":"path","name":"mailbox_id","required":true,"schema":{"format":"uuid","title":"Mailbox Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"The mailbox is disconnected, or Gmail answered with a definite error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Google could not answer, so nothing was checked."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Verify a mailbox's connection still works","tags":["senders"]}},"/notifications/preferences/":{"get":{"description":"Complete, with defaults filled in: a kind with no stored row is on.","operationId":"list_notification_preferences","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationPreferenceSchema"},"title":"Response List Notification Preferences","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"This user's notification switches","tags":["notifications"]},"put":{"operationId":"put_notification_preferences","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreferencesPutSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationPreferenceSchema"},"title":"Response Put Notification Preferences","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update this user's notification switches","tags":["notifications"]}},"/notifications/rules/":{"get":{"operationId":"list_notification_rules","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationRuleReadSchema"},"title":"Response List Notification Rules","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List notification rules","tags":["notifications"]},"post":{"description":"One trigger, one destination. Notifying both a Slack channel and a person is two rules. There is no 'notify nobody' rule: silence is the absence of one.","operationId":"create_notification_rule","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationRuleCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationRuleReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"409":{"description":"No Slack workspace is connected."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a notification rule","tags":["notifications"]}},"/notifications/rules/{rule_id}/":{"delete":{"operationId":"delete_notification_rule","parameters":[{"in":"path","name":"rule_id","required":true,"schema":{"format":"uuid","title":"Rule Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a notification rule","tags":["notifications"]}},"/notifications/slack/":{"delete":{"description":"Rules keep their channels, so reconnecting restores routing rather than rebuilding it.","operationId":"disconnect_slack","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Disconnect Slack","tags":["notifications"]},"get":{"operationId":"get_slack_connection","responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SlackConnectionReadSchema"},{"type":"null"}],"title":"Response Get Slack Connection"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"The organization's Slack connection","tags":["notifications"]}},"/notifications/slack/callback/":{"post":{"operationId":"complete_slack_connect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackCallbackSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackConnectionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The install could not be completed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Finish connecting a Slack workspace","tags":["notifications"]}},"/notifications/slack/channels/":{"get":{"operationId":"list_slack_channels","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SlackChannelReadSchema"},"title":"Response List Slack Channels","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"409":{"description":"No Slack workspace is connected."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Channels the bot can post to","tags":["notifications"]}},"/notifications/slack/connect/":{"post":{"operationId":"start_slack_connect","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackAuthorizeUrlSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"409":{"description":"Slack is not configured for this deployment."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Begin connecting a Slack workspace","tags":["notifications"]}},"/onboarding/":{"get":{"description":"Get the organization's Getting started checklist: six steps from the first people search to the first launched sequence. Created on first read. Every read while a step is pending checks the workspace for what the pending steps ask for and completes the ones it finds, so progress is right whether the step was done in the dashboard, through the API or from the Chrome extension.","operationId":"get_onboarding","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the Getting started checklist","tags":["onboarding"]}},"/onboarding/dismiss/":{"post":{"description":"Hide the checklist widget for the whole organization. Idempotent. The checklist stays readable and keeps tracking progress; only the sidebar stops showing it.","operationId":"dismiss_onboarding","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Hide the Getting started checklist","tags":["onboarding"]}},"/outbound-agents/presets/":{"get":{"description":"The personalities an outbound agent can write in, what each model costs per message, and the prompts a new agent starts with. Read by the AI writing tab so the prices it quotes are the prices that are charged.","operationId":"read_outbound_presets","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundPresetsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read the outbound agent presets","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/":{"get":{"description":"One sequence's outbound agent: its personality, goal, call to action, language, per-message prompts, reply prompt, model and research switch, with the version number an edit must be sent against.","operationId":"get_outbound_agent_configuration","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read an outbound agent","tags":["outbound-agents"]},"patch":{"description":"Write a new version of the agent's configuration. The whole configuration is sent against the version it was read at; an edit against a stale version is refused so two people editing at once cannot silently overwrite each other.","operationId":"update_outbound_agent","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundAgentUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"409":{"description":"The agent changed since it was read."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Change an outbound agent","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/conversations/":{"get":{"description":"What the agent found out about one contact and every message it has written them, oldest first. The contact is named by the key the sequence gave it.","operationId":"read_outbound_conversation","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"description":"The caller's key for the contact, e.g. sequence:<id>:record:<id>.","in":"query","name":"subject_key","required":true,"schema":{"description":"The caller's key for the contact, e.g. sequence:<id>:record:<id>.","maxLength":255,"title":"Subject Key","type":"string"}},{"description":"True answers null, rather than 404, for a contact the agent has written nothing to yet, as a step's Preview reads every contact it shows. An agent that does not exist is still 404.","in":"query","name":"missing_ok","required":false,"schema":{"default":false,"description":"True answers null, rather than 404, for a contact the agent has written nothing to yet, as a step's Preview reads every contact it shows. An agent that does not exist is still 404.","title":"Missing Ok","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OutboundConversationReadSchema"},{"type":"null"}],"title":"Response Read Outbound Conversation"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read one contact's conversation with the agent","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/conversations/facts/":{"delete":{"description":"Remove a fact the research got wrong, so no later message to this contact is built on it. The rest of the research stays.","operationId":"delete_outbound_research_fact","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"description":"The caller's key for the contact, e.g. sequence:<id>:record:<id>.","in":"query","name":"subject_key","required":true,"schema":{"description":"The caller's key for the contact, e.g. sequence:<id>:record:<id>.","maxLength":255,"title":"Subject Key","type":"string"}},{"description":"The fact's position in the research.","in":"query","name":"index","required":true,"schema":{"description":"The fact's position in the research.","minimum":0,"title":"Index","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Drop one fact from a contact's research","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/feedback/":{"get":{"description":"Every rating, note and rewrite people have given this agent's messages, newest first, with whether a prompt rewrite has already taken it in.","operationId":"list_outbound_feedback","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"in":"query","name":"message_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Message Id"}},{"description":"How many rows, newest first.","in":"query","name":"limit","required":false,"schema":{"default":200,"description":"How many rows, newest first.","maximum":500,"minimum":1,"title":"Limit","type":"integer"}},{"description":"Only feedback that teaches the agent: a Needs work, a note or a rewrite. A Looks good alone is a record, and approving a task records one.","in":"query","name":"teaching_only","required":false,"schema":{"default":false,"description":"Only feedback that teaches the agent: a Needs work, a note or a rewrite. A Looks good alone is a record, and approving a task records one.","title":"Teaching Only","type":"boolean"}},{"description":"Only feedback given in one place.","in":"query","name":"source","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/FeedbackSource"},{"type":"null"}],"description":"Only feedback given in one place.","title":"Source"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OutboundFeedbackReadSchema"},"title":"Response List Outbound Feedback","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List what people told the agent","tags":["outbound-agents"]},"post":{"description":"Record a thumb, a note, or both. What says something needs work teaches: a thumbs down, a note or a rewrite rides into later messages as an example, and proposing prompts rewrites the prompts from it. A Looks good with no rewrite is kept as the person's record and never trains the agent.","operationId":"create_outbound_feedback","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundFeedbackCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundFeedbackReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rate one message the agent wrote","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/feedback/{feedback_id}/":{"delete":{"description":"Remove feedback without reverting prompt changes already applied from it.","operationId":"delete_outbound_feedback","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"in":"path","name":"feedback_id","required":true,"schema":{"format":"uuid","title":"Feedback Id","type":"string"}},{"in":"query","name":"expected_updated_at","required":true,"schema":{"format":"date-time","title":"Expected Updated At","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"409":{"description":"The agent changed since it was read."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Undo your feedback","tags":["outbound-agents"]},"put":{"description":"Replace only the signed-in author's feedback, refusing an older copy.","operationId":"update_outbound_feedback","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"in":"path","name":"feedback_id","required":true,"schema":{"format":"uuid","title":"Feedback Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundFeedbackUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundFeedbackReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"409":{"description":"The agent changed since it was read."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Edit your feedback","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/messages/{message_id}/":{"get":{"description":"One written message with everything shown beside it: the agent's own confidence, the independent quality score, what it built the message on, and what the checks found.","operationId":"get_outbound_message","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"in":"path","name":"message_id","required":true,"schema":{"format":"uuid","title":"Message Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundMessageReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read one message the agent wrote","tags":["outbound-agents"]},"patch":{"description":"Replace the words that will send. What the agent wrote is kept beside them, and the change is recorded as feedback the agent learns from. A message that has already gone out cannot be changed.","operationId":"edit_outbound_message","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"in":"path","name":"message_id","required":true,"schema":{"format":"uuid","title":"Message Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundMessageEditSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundMessageReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rewrite one message the agent wrote","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/messages/{message_id}/regenerate/":{"post":{"description":"Throw away the agent's words for one message and have it write them again, optionally with a note on what to change ('shorter', 'mention their new office'). A message in the sequence's cadence is rewritten in the background, at the message's usual price, and appears on the contact's conversation once written. A reply is rewritten straight away as a new draft that waits for approval in the inbox. Refused for a message that has already been sent, one the agent is writing right now, one waiting on a person in the approval queue unless `from_task` says the ask comes from that task (which is then cancelled), and a preview.","operationId":"regenerate_outbound_message","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"in":"path","name":"message_id","required":true,"schema":{"format":"uuid","title":"Message Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundMessageRegenerateSchema"}}}},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundMessageRegenerateReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Asked with an API key. Writing a message again spends the workspace's credits on somebody's say-so, so it takes a signed-in person."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The agent, the message, or the contact or inbox draft it was written for is gone."},"409":{"description":"The message cannot be written again now: it has been sent, the agent is already writing it, a person is reviewing it, or it is a preview."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"description":"A reply on a thread that has lost its sequence is drafted in the default voice, and the workspace has no assistant turn left today."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Have the agent write one message again","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/proposals/":{"post":{"description":"Rewrite the agent's prompts from what people said needs work (a thumbs down, a note, a rewrite), and return the before and after for each one; a Looks good never trains. Nothing is written until the proposal is accepted. Spends one of the workspace's daily assistant turns.","operationId":"propose_outbound_prompts","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundPromptProposalRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundPromptProposalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"description":"The workspace has no assistant turn left today."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Propose better prompts from the agent's feedback","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/proposals/accept/":{"post":{"description":"Write the accepted prompts as the agent's next version and mark the feedback they were written from as taken in. Refused when the agent has changed since the proposal was made.","operationId":"accept_outbound_prompts","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundPromptProposalAcceptSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"409":{"description":"The agent changed since it was read."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Accept proposed prompts","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/proposals/stream/":{"post":{"description":"The same rewrite as proposing better prompts, as a stream of Server-Sent Events: a `step` frame for each piece of work once it is done (reading what people said needs work, then each prompt it rewrote), each with its measured duration, then one `result` frame whose `data` is the proposal, the before and after for each prompt. Nothing is written until the proposal is accepted. Spends one of the workspace's daily assistant turns.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `not_found` when the agent is not this workspace's, `limit` when the workspace has used today's AI Assistant allowance, `paused` when the AI Assistant is paused, and no reason for anything else, including no feedback to learn from, whose sentence says so.\n\nClosing the connection does not stop the rewrite.","operationId":"stream_outbound_prompt_proposal","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundPromptProposalRequestSchema"}}},"required":true},"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/OutboundPromptProposalReadSchema","type":"string"}}},"description":"A stream of Server-Sent Events; the final `result` frame's `data` is the proposal."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Propose better prompts from the agent's feedback, streaming the work","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/versions/":{"get":{"description":"Every configuration this agent has had, newest first, with what wrote each one: a person's edit, a revert, an accepted rewrite from feedback, or a copy.","operationId":"list_outbound_agent_versions","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OutboundAgentVersionReadSchema"},"title":"Response List Outbound Agent Versions","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List an outbound agent's versions","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/versions/{version}/changes/":{"get":{"operationId":"get_outbound_version_changes","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"in":"path","name":"version","required":true,"schema":{"title":"Version","type":"integer"}},{"in":"query","name":"compare_to","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Compare To"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundVersionChangesSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Compare a writing version","tags":["outbound-agents"]}},"/outbound-agents/{agent_id}/versions/{version}/revert/":{"post":{"description":"Apply an earlier configuration as a NEW version, so the history stays linear and the revert itself can be undone.","operationId":"revert_outbound_agent","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"format":"uuid","title":"Agent Id","type":"string"}},{"in":"path","name":"version","required":true,"schema":{"title":"Version","type":"integer"}},{"in":"query","name":"expected_version","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Outbound agent not found."},"409":{"description":"The agent changed since it was read."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Revert an outbound agent to an earlier version","tags":["outbound-agents"]}},"/outreach-tasks/":{"get":{"description":"One list across every channel: LinkedIn steps and emails, each waiting on a person, waiting on its channel, or settled. Newest first by default, the order the Tasks page opens in; order by `created_at` or `contact_label`, which sorts by the contact as the Tasks page's Contact column shows them (a LinkedIn profile address by its slug, letters in any case together, a task about nobody as the empty name). Pending by default; pass `status` (repeatable) for the other tabs, and narrow by channel, task kind, sender, sequence, how it ended (`outcome`; the failed steps are `status=cancelled&outcome=failed`), why it waits for a person (`ask_reason`), words in the contact or the subject (`search`) or how long it has been waiting. `GET /outreach-tasks/length/` counts the same filters. Every name the row shows (the sequence, the step, the sender, who decided) is resolved here, and every approved, finished or cancelled task says where its work stands (`progress`: queued with its expected start, running, held by the sending window, sent, failed and whether it can be retried).","operationId":"list_outreach_tasks","parameters":[{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListOutreachTasksFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForCreatedAtContactLabel","default":"created_at","enum":["created_at","contact_label"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_OutreachTaskReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the approval queue","tags":["outreach"]}},"/outreach-tasks/activity/":{"get":{"description":"A sender's Activity: every email that went out as them (a sequence's email or a reply from the inbox) and every LinkedIn step that ran on their account, with who let it go, plus every task a person refused. Each row says how it ended (`outcome`: `sent`, `done`, `failed`, `skipped`, `already_pending`, `stopped`, or `not_sent` for a refusal) and how it was decided (`decision`: `approved` with the approver, `automatic` when no person decided, `rejected` with who refused it, `sent_by_person` for a reply a person wrote in the inbox, `not_recorded` for a LinkedIn step from before Activity whose approval was not kept), with `ask_reason` saying why it was held for a person first. Our own LinkedIn checks (the inbox, sent connection requests, new connections) are not activity and are left out. Newest first by default; order by `occurred_at` or `contact_label`. Pass `sender_profile_id` for one sender; omit it for the whole workspace.","operationId":"list_outreach_activity","parameters":[{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListOutreachActivityFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForOccurredAtContactLabel","default":"occurred_at","enum":["occurred_at","contact_label"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_OutreachActivityReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List what went out as a sender","tags":["outreach"]}},"/outreach-tasks/activity/count/":{"get":{"description":"How many Activity rows the same filters as the list select, for the page's total.","operationId":"count_outreach_activity","parameters":[{"description":"Only what went out as these senders; omit for every sender.","in":"query","name":"sender_profile_id","required":false,"schema":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only what went out as these senders; omit for every sender.","title":"Sender Profile Id"}},{"description":"Only these channels (`email`, `linkedin`); omit for both.","in":"query","name":"channel","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaskChannel"},"type":"array"},{"type":"null"}],"description":"Only these channels (`email`, `linkedin`); omit for both.","title":"Channel"}},{"description":"Only what was decided this way: `approved` (a person or an API key approved it before it went), `automatic` (no person decided: the rules let it go), `rejected` (a person refused it, so it never went), `sent_by_person` (a person wrote and sent it from the inbox), `not_recorded` (a LinkedIn step from before Activity whose approval was not kept).","in":"query","name":"decision","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/ActivityDecision"},"type":"array"},{"type":"null"}],"description":"Only what was decided this way: `approved` (a person or an API key approved it before it went), `automatic` (no person decided: the rules let it go), `rejected` (a person refused it, so it never went), `sent_by_person` (a person wrote and sent it from the inbox), `not_recorded` (a LinkedIn step from before Activity whose approval was not kept).","title":"Decision"}},{"description":"Only what ended this way: `sent` (an email the provider accepted), `done` (a LinkedIn step that did its job), `failed`, `skipped`, `already_pending` (a connection request somebody had already sent), `stopped`, `not_sent` (refused).","in":"query","name":"outcome","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/ActivityOutcome"},"type":"array"},{"type":"null"}],"description":"Only what ended this way: `sent` (an email the provider accepted), `done` (a LinkedIn step that did its job), `failed`, `skipped`, `already_pending` (a connection request somebody had already sent), `stopped`, `not_sent` (refused).","title":"Outcome"}},{"description":"Only these kinds: a LinkedIn action slug (`connection_request`, `send_message`, …), `email` for a sequence's email, or `reply` for a reply from the inbox.","in":"query","name":"kind","required":false,"schema":{"anyOf":[{"items":{"maxLength":32,"minLength":1,"type":"string"},"type":"array"},{"type":"null"}],"description":"Only these kinds: a LinkedIn action slug (`connection_request`, `send_message`, …), `email` for a sequence's email, or `reply` for a reply from the inbox.","title":"Kind"}},{"description":"Only what these sequences sent; omit for all of them.","in":"query","name":"sequence_id","required":false,"schema":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only what these sequences sent; omit for all of them.","title":"Sequence Id"}},{"description":"Only what happened at or after this instant, with its timezone offset.","in":"query","name":"occurred_after","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only what happened at or after this instant, with its timezone offset.","title":"Occurred After"}},{"description":"Only what happened before this instant, with its timezone offset.","in":"query","name":"occurred_before","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only what happened before this instant, with its timezone offset.","title":"Occurred Before"}},{"description":"Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.","in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.","title":"Search"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachActivityCountSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count what went out as a sender","tags":["outreach"]}},"/outreach-tasks/activity/{activity_id}/email/":{"get":{"description":"The email one row of a sender's activity sent, exactly as it left: its HTML part, the words, the signature and the opt-out footer, as the contact got them. Null for a LinkedIn row or a send from before the send kept its email.","operationId":"get_outreach_activity_email","parameters":[{"in":"path","name":"activity_id","required":true,"schema":{"format":"uuid","title":"Activity Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachActivityEmailReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Task not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read the email an activity row sent","tags":["outreach"]}},"/outreach-tasks/bulk/approve/":{"post":{"description":"The queue's bulk approve, over the rows a person ticked. Each is approved exactly as it would be on its own (a LinkedIn step joining its sender's line), and a row that has moved on meanwhile is counted as skipped rather than failing the batch, because a selection goes stale while it is being read; so is a LinkedIn step LinkedIn cannot take now (the sender is not connected), which still waits. The answer says when the approved work is expected to run (`schedule`): per sender, when their LinkedIn steps start, how many wait for the daily reset and what stops them (no browser open, a limit); and whether the emails go now or when the sending window opens. Of the rows the person had opened (`opened_task_ids`), words the agent wrote that nobody changed are recorded as approved as written: their Looks good, kept as a record that never trains the agent.","operationId":"bulk_approve_outreach_tasks","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkApproveSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDecisionResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Approve every ticked task","tags":["outreach"]}},"/outreach-tasks/bulk/reject/":{"post":{"description":"The queue's bulk reject, over the rows a person ticked. A reason, when one is given, covers the batch and is kept on every row it settled as its note; the Tasks page sends none. A bulk rejection teaches the agent nothing: only a single rejection is the person's Needs work on the agent's words. As with a single rejection this is a judgement about the contact, not the step: the engine stops each of them when it next sweeps. Rows that are no longer waiting on a person are skipped.","operationId":"bulk_reject_outreach_tasks","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRejectSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDecisionResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Reject every ticked task","tags":["outreach"]}},"/outreach-tasks/count/":{"get":{"description":"`pending` is the nav badge: tasks waiting on a person. Scheduled work is waiting on a channel, and a badge that counted it would nag about things nobody can act on. `failed_retryable` counts the failed LinkedIn steps whose contact can still be retried, for the alert beside the queue; it is not part of the badge.","operationId":"count_outreach_tasks","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskCountSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count what is waiting on a person","tags":["outreach"]}},"/outreach-tasks/events/":{"get":{"description":"Server-sent event stream of everything outreach in the workspace: the approval queue (`tasks_changed`), a sequence's contacts (`contacts_changed`, with the sequence) and a sender's LinkedIn steps and browser (`linkedin_steps_changed`, with the account). Every frame is a wake-up, never data: refetch the reads the kind names. `hello` on connect and `resync` after a gap mean refetch everything on screen.\n\nThe server closes the stream after a few minutes with a `reconnect` frame; open a fresh one. Comment heartbeats keep intermediaries from dropping an idle connection. Refused with 503 and `Retry-After` when the server is near its stream limit; keep polling until a retry succeeds.\n\nRequires Clerk authentication; API keys are rejected.","operationId":"stream_outreach_events","responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/OutreachStreamEventSchema","type":"string"}}},"description":"A stream of change events; each SSE frame's `data` is one event."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Stream the workspace's outreach change events","tags":["outreach"]}},"/outreach-tasks/length/":{"get":{"description":"How many tasks the list's filters select, for the Tasks page's total, and the reasons the tasks every other filter selects wait for a person, for its Held because filter. Takes exactly the list's filters.","operationId":"count_listed_outreach_tasks","parameters":[{"description":"Only these statuses; repeat the parameter for several. Defaults to pending.","in":"query","name":"status","required":false,"schema":{"description":"Only these statuses; repeat the parameter for several. Defaults to pending.","items":{"$ref":"#/components/schemas/TaskStatus"},"title":"Status","type":"array"}},{"description":"Only these channels; omit for every channel.","in":"query","name":"channel","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaskChannel"},"type":"array"},{"type":"null"}],"description":"Only these channels; omit for every channel.","title":"Channel"}},{"description":"Only these kinds: a LinkedIn action slug (`profile_view`, `connection_request`, …) or `email`. Omit for every kind.","in":"query","name":"kind","required":false,"schema":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"Only these kinds: a LinkedIn action slug (`profile_view`, `connection_request`, …) or `email`. Omit for every kind.","title":"Kind"}},{"description":"Only these senders; omit for everyone.","in":"query","name":"sender_profile_id","required":false,"schema":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only these senders; omit for everyone.","title":"Sender Profile Id"}},{"description":"Only these sequences; omit for all of them.","in":"query","name":"sequence_id","required":false,"schema":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only these sequences; omit for all of them.","title":"Sequence Id"}},{"description":"Only the tasks of these contacts, by their enrolment in a sequence; omit for everyone.","in":"query","name":"enrolment_id","required":false,"schema":{"anyOf":[{"items":{"format":"uuid","type":"string"},"type":"array"},{"type":"null"}],"description":"Only the tasks of these contacts, by their enrolment in a sequence; omit for everyone.","title":"Enrolment Id"}},{"description":"Only tasks that entered the queue before this instant, which is 'waiting longer than'. Read off when the task was created, not when its channel would run it. Omit for however long they have been here.","in":"query","name":"waiting_since_before","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Only tasks that entered the queue before this instant, which is 'waiting longer than'. Read off when the task was created, not when its channel would run it. Omit for however long they have been here.","title":"Waiting Since Before"}},{"description":"Only tasks that ended with one of these words (repeatable): `failed`, `skipped`, `stopped`, `succeeded` and the like. The Failed view is `status=cancelled` with `outcome=failed`. Omit for however they ended.","in":"query","name":"outcome","required":false,"schema":{"anyOf":[{"items":{"maxLength":32,"minLength":1,"type":"string"},"type":"array"},{"type":"null"}],"description":"Only tasks that ended with one of these words (repeatable): `failed`, `skipped`, `stopped`, `succeeded` and the like. The Failed view is `status=cancelled` with `outcome=failed`. Omit for however they ended.","title":"Outcome"}},{"description":"Only tasks held for a person for one of these reasons (repeatable): the Tasks page's Held because. Omit for every reason.","in":"query","name":"ask_reason","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/AskReason"},"type":"array"},{"type":"null"}],"description":"Only tasks held for a person for one of these reasons (repeatable): the Tasks page's Held because. Omit for every reason.","title":"Ask Reason"}},{"description":"Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.","in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.","title":"Search"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskLengthSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count the approval queue","tags":["outreach"]}},"/outreach-tasks/settings/effective/":{"get":{"description":"What one sender's channel actually does in one sequence, and which level said so. A page can then say 'this is the sender's own setting' rather than showing a value with no provenance. Two levels: the sender decides, and a sequence may only ever tighten it. Also answers how much email sends without a person approving it: for the sender when you pass `sender_profile_id`, and for the sequence as a whole plus each sender assigned to it when you pass `sequence_id`. Both ids are optional; with neither, the channel modes are the product defaults. Reads only: a sender's send mode is changed on the sender's own settings.","operationId":"get_effective_approval","parameters":[{"in":"query","name":"sender_profile_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sender Profile Id"}},{"in":"query","name":"sequence_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sequence Id"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EffectiveApprovalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Resolve the approval mode that applies","tags":["outreach"]}},"/outreach-tasks/{task_id}/":{"get":{"operationId":"get_outreach_task","parameters":[{"in":"path","name":"task_id","required":true,"schema":{"format":"uuid","title":"Task Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Task not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read one task","tags":["outreach"]}},"/outreach-tasks/{task_id}/approve/":{"post":{"description":"Let a pending task run, and record who said so. An approved LinkedIn step joins its sender's line, and whichever browser holds the lease performs it in turn: a reply at once, a sequence's step through the send engine, which holds it while its sequence or contact is paused. An approved email is sent at once, or when its sequence's sending window opens. The answer is the task's row plus `schedule`, the same forecast the bulk approve gives: when the step is expected to run and what would stop it. 409 when the task is no longer pending, or when its step cannot be taken now (the sender's LinkedIn is not connected, the connection request it would withdraw is no longer pending, the send engine could not take a sequence's step just now); the task then still waits. When the person opened the task first (`opened`), words the agent wrote that nobody changed are recorded as approved as written: their Looks good, kept as a record that never trains the agent.","operationId":"approve_outreach_task","parameters":[{"in":"path","name":"task_id","required":true,"schema":{"format":"uuid","title":"Task Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OutreachTaskApproveSchema"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskApprovalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Task not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The task is no longer in a state this decision applies to."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Approve a task","tags":["outreach"]}},"/outreach-tasks/{task_id}/edit/":{"post":{"description":"Change what a pending task will send before approving it. An email's rewrite is stored as the contact's message override; a LinkedIn note or message is kept on the task as typed, and clipped to LinkedIn's ceilings when the approved step is queued, the way the step's own render would be. Only while the task is pending: once the channel has it, the text a person saw is the text that sends.","operationId":"edit_outreach_task","parameters":[{"in":"path","name":"task_id","required":true,"schema":{"format":"uuid","title":"Task Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskEditSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Task not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The task is no longer in a state this decision applies to."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The task carries no message to edit."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rewrite a pending task's message","tags":["outreach"]}},"/outreach-tasks/{task_id}/email/":{"get":{"description":"What the card's email carries besides its words, so the card can show it whole as the contact gets it: for a card still to go, the signature and opt-out footer the send adds below the words (the footer's link unsubscribes nobody); once it went, its HTML part exactly as it left. Both null for a LinkedIn task.","operationId":"get_outreach_task_email","parameters":[{"in":"path","name":"task_id","required":true,"schema":{"format":"uuid","title":"Task Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskEmailReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Task not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read an email card's email beyond its words","tags":["outreach"]}},"/outreach-tasks/{task_id}/reject/":{"post":{"description":"Refuse a pending task, and record who did. This is a judgement about the contact, not the step: the engine stops them in the sequence when it next sweeps. A LinkedIn step waiting on a person was never queued, so no browser runs it. On words the agent wrote, a person's rejection that says why is also their Needs work on those words, with the reason as the note, which teaches the agent. One with no reason teaches nothing.","operationId":"reject_outreach_task","parameters":[{"in":"path","name":"task_id","required":true,"schema":{"format":"uuid","title":"Task Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskRejectSchema"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Task not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The task is no longer in a state this decision applies to."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Reject a task","tags":["outreach"]}},"/outreach-tasks/{task_id}/thread/":{"get":{"description":"The follow-ups the agent drafted for the contact after the card's own email, in the order they go, with each step's wait. One approval covers the thread: approving the card approves each of these to send as written when its turn comes, with no card of its own; rejecting the card stops the contact. Empty for a LinkedIn task and an email nothing was drafted after.","operationId":"get_outreach_task_thread","parameters":[{"in":"path","name":"task_id","required":true,"schema":{"format":"uuid","title":"Task Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskThreadReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Task not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read the rest of an email card's thread","tags":["outreach"]}},"/outreach-tasks/{task_id}/thread/{step_id}/edit/":{"post":{"description":"Change what one follow-up on a pending email card will send, before approving the card. A signed in person's edit is kept as their lesson, like an edit of the card's own email; one through an API key is nobody's, and teaches nothing. The follow-ups after it stay as they are. Answers with the thread as it now stands. 409 once the card is decided: the words a person approved are the words that send.","operationId":"edit_outreach_task_thread_email","parameters":[{"in":"path","name":"task_id","required":true,"schema":{"format":"uuid","title":"Task Id","type":"string"}},{"in":"path","name":"step_id","required":true,"schema":{"format":"uuid","title":"Step Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskThreadEditSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachTaskThreadReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Task not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The task is no longer in a state this decision applies to."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rewrite a follow-up on a pending email card","tags":["outreach"]}},"/referral/":{"get":{"description":"The friends who joined through this workspace's link, newest first.","operationId":"list_referrals","parameters":[{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListReferralsFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdSignedUpAtCreatedAt","default":"signed_up_at","enum":["id","signed_up_at","created_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ReferralReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List referrals","tags":["referral"]}},"/referral/claim/":{"post":{"description":"Attribute the caller's workspace to a referral code and pay the signup rewards. Safe to call repeatedly and never an error: a code that does not apply reports `attributed: false`. Requires a signed-in user rather than an API key: the claim records who signed up, and an API key has no person behind it.","operationId":"claim_referral","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralClaimRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralClaimReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Claim a referral code","tags":["referral"]}},"/referral/length/":{"get":{"description":"How many referrals match the filter. The list is cursor-paginated and therefore cannot report a total itself, but the page shows an exact 'N of M', so the count is its own read.","operationId":"get_referrals_count","parameters":[{"description":"Narrow to friends still on a free plan, or only those on a paid plan. The two are disjoint; omit for everything.","in":"query","name":"status","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ReferralStatus"},{"type":"null"}],"description":"Narrow to friends still on a free plan, or only those on a paid plan. The two are disjoint; omit for everything.","title":"Status"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralCountSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count referrals","tags":["referral"]}},"/referral/program/":{"get":{"description":"What the program pays, for the signup page. Deliberately unauthenticated: the person who most needs to see it has no account yet. It returns the two amounts and nothing else: resolving a code to the workspace behind it would turn this into a way to enumerate customer names.","operationId":"get_referral_program","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralProgramReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"summary":"Get the referral program's reward amounts","tags":["referral"]}},"/referral/summary/":{"get":{"description":"The workspace's shareable referral link, the three headline counts, and the reward amounts the explainer copy quotes. The referral code is minted on first read, so a workspace that never opens the page never gets one.","operationId":"get_referral_summary","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralSummaryReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the workspace's referral summary","tags":["referral"]}},"/sender-profiles/":{"delete":{"description":"Delete the selection in one statement. Their mailboxes stay connected, unassigned. Ids that no longer exist are skipped rather than failing the request; `count` reports what actually went. Refused, deleting nothing, when any of them is used by a sequence; the error names the sequences.","operationId":"bulk_delete_sender_profiles","parameters":[{"description":"Senders to delete","in":"query","name":"ids","required":true,"schema":{"description":"Senders to delete","items":{"format":"uuid","type":"string"},"maxItems":500,"title":"Ids","type":"array"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete many senders","tags":["senders"]},"get":{"operationId":"list_sender_profiles","parameters":[{"in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SenderProfileReadSchema"},"title":"Response List Sender Profiles","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List senders","tags":["senders"]},"post":{"description":"Creates a draft sender; it activates once a mailbox is attached.","operationId":"create_sender_profile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderProfileCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderProfileReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Add a sender","tags":["senders"]}},"/sender-profiles/bulk/":{"patch":{"description":"The Senders list's bulk action: set the first name, last name or signature across the selection. Omitted fields are left unchanged everywhere: 'leave unchanged' and 'set to empty' are different requests. Setting both name halves across more than one sender is refused, because two senders cannot carry the same name; nothing is changed when it is.","operationId":"bulk_update_sender_profiles","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderProfileBulkUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderProfileBulkUpdateResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Edit many senders at once","tags":["senders"]}},"/sender-profiles/{profile_id}/":{"delete":{"description":"Deletes the sender; its mailboxes survive, unassigned.","operationId":"delete_sender_profile","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a sender","tags":["senders"]},"get":{"operationId":"get_sender_profile","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderProfileReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a sender","tags":["senders"]},"patch":{"description":"Change who a sender is and how their messages go out. The first name, last name and signature are the identity messages are sent as, and the display name follows the two names. The job title and booking link fill the {{Sender title}} and {{Sender booking link}} variables. `send_mode` decides whether the messages the agent writes for this sender go out on their own or wait for a person. `email_approval_mode` pins whether this sender's emails wait in the approval queue; null hands the choice back to the workspace default. Only a person signed in to Oneprofile can change the send mode, email approval, job title or booking link; an API key can change the name and signature. Only a workspace admin can choose Always send, and only with `confirm` set to true. Every change to the send mode, job title or booking link is recorded with who made it. A looser send mode releases the emails already waiting for approval that it alone held, on every sequence the sender is on, unless another sender on that sequence still asks.","operationId":"update_sender_profile","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderProfileUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderProfileReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"The caller may not make this change: an API key changing the send mode, email approval, job title or booking link, or anyone but a workspace admin choosing Always send."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a sender","tags":["senders"]}},"/sender-profiles/{profile_id}/linkedin/":{"get":{"description":"Returns whether a LinkedIn account is connected to this sender, and if so its live state: which browsers are connected and when each was last seen, today's usage against each ceiling, how much work is queued, and what the next step waits on and until when (the time between steps, a limit's reset). Not-connected is a normal state rather than a 404: it carries the connection token the person pastes into the extension, and reading it is what mints that token.","operationId":"get_linkedin_account","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInAccountStateSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Sender not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read a sender's LinkedIn connection","tags":["linkedin"]}},"/sender-profiles/{profile_id}/linkedin/actions/{action_id}/":{"delete":{"description":"Takes a step out of the line before any browser has it. Deliberately queued-only: a claimed step is already running in somebody's browser, and cancelling it here would leave the two surfaces disagreeing about what happened. Its row on Tasks reads stopped, and a sequence's contact moves on as its step's end says. Approving and rejecting a step happen on Tasks, before it is queued.","operationId":"cancel_linkedin_action","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}},{"in":"path","name":"action_id","required":true,"schema":{"format":"uuid","title":"Action Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No LinkedIn account for this sender."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"The step is no longer queued."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Cancel a queued LinkedIn step","tags":["linkedin"]}},"/sender-profiles/{profile_id}/linkedin/connection-token/regenerate/":{"post":{"description":"Mints a new connection token and signs out every browser connected with the old one. For when the token was pasted somewhere it should not have been: the string AND every session it already produced stop working.","operationId":"regenerate_linkedin_connection_token","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInAccountStateSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Sender not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Replace the sender's connection token","tags":["linkedin"]}},"/sender-profiles/{profile_id}/linkedin/disconnect/":{"post":{"description":"Signs every connected browser out and stops all work. History, settings and queued steps are kept, so reconnecting the same LinkedIn account picks up where it left off. Browsers are told over the push channel at once, and 401 on their next call regardless. The connection token is replaced.","operationId":"disconnect_linkedin","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInAccountStateSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No LinkedIn account for this sender."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Disconnect the sender's LinkedIn account","tags":["linkedin"]}},"/sender-profiles/{profile_id}/linkedin/events/":{"get":{"description":"Server-sent event stream of everything that moves on a sender's LinkedIn tab: a browser connecting or disconnecting, the approval setting changing, and steps being queued, skipped or cancelled, including when the person did it in the extension or in another window.\n\nEvery frame is a wake-up, never a source of truth: the client re-reads the sender's state on `hello` and on each signal, so a dropped frame costs one round trip and nothing more. This is the dashboard half of the channel the extension already has over `/linkedin/agent/events/`; the two carry the same signals.\n\nThe server closes the stream after a few minutes with a `reconnect` frame; open a fresh one. Comment heartbeats keep intermediaries from dropping an idle connection.\n\nRequires Clerk authentication; API keys are rejected.","operationId":"stream_sender_linkedin_events","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/LinkedInStreamEventSchema","type":"string"}}},"description":"A stream of change events; each SSE frame's `data` is one event."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Sender not found."},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Stream a sender's LinkedIn changes","tags":["linkedin"]}},"/sender-profiles/{profile_id}/linkedin/history/":{"get":{"description":"Settled actions, newest first, with lifetime outcome counts and timings.","operationId":"list_linkedin_history","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}},{"in":"query","name":"kind","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LinkedInActionKind"},{"type":"null"}],"title":"Kind"}},{"in":"query","name":"status","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LinkedInActionStatus"},{"type":"null"}],"title":"Status"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInHistoryPageSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No LinkedIn account for this sender."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List completed LinkedIn steps","tags":["linkedin"]}},"/sender-profiles/{profile_id}/linkedin/queue/":{"get":{"description":"The steps not over yet, in the order the governor will hand them out: the rows the extension's side panel renders, plus the steps a paused sequence or paused contact holds, each marked `held`. A browser is never handed a held step.","operationId":"list_linkedin_queue","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LinkedInActionReadSchema"},"title":"Response List Linkedin Queue","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No LinkedIn account for this sender."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List queued LinkedIn steps","tags":["linkedin"]}},"/sender-profiles/{profile_id}/linkedin/settings/":{"patch":{"description":"Sets the per-kind daily ceilings, the rolling weekly ones (null clears a kind's weekly limit; connection requests always keep one), the least time between two steps (`min_action_interval_seconds`, 60 to 3,600 seconds) and the sender's approval setting (`run_mode`): whether a person approves each LinkedIn step on Tasks before it is queued. Switching it to manual takes back the steps queued without asking that no browser has started; switching it to auto queues the ones only this setting held. The time between steps belongs to the LinkedIn account, not to a sequence: it holds across every sequence the account sends for. These are the controls that keep a customer's account out of trouble, so there is deliberately no way to disable the governor entirely, only to choose its numbers.","operationId":"update_linkedin_settings","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInSettingsUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInAccountReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No LinkedIn account for this sender."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"A limit is above its maximum, or the time between steps is outside 60 to 3,600 seconds."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update LinkedIn safety settings","tags":["linkedin"]}},"/sender-profiles/{profile_id}/linkedin/test-actions/":{"post":{"description":"Queues a single step against a profile you name, so the channel can be tried end to end without building a sequence and waiting for it to reach a LinkedIn step.\n\nIt is a REAL step, and asking for it is its approval: it joins the sender's line behind their outreach, with the same daily limits and credit as any step, and runs when their browser takes it. Its row on Tasks names whoever asked as its approver.\n\nOne of: a profile view, a connection request (its note up to 200 characters), a message, a withdrawal of the connection request pending to the profile, a follow, and a like of the person's latest post. An InMail is not offered: it spends the sender's own Premium credits. One step of each kind waits at a time.","operationId":"queue_linkedin_test_action","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInTryStepSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInActionReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"No LinkedIn account for this sender."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"A Try step of this kind is already waiting or running. It shares the real line and the real daily limits, so one of each kind waits at a time."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The URL names no LinkedIn person or the sender's own profile, the kind cannot be queued, or a withdrawal was asked for with no connection request pending."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Try one LinkedIn step","tags":["linkedin"]}},"/sender-profiles/{profile_id}/mailboxes/":{"put":{"description":"Assigns exactly this set of mailboxes to the profile (the picker's save).","operationId":"set_profile_mailboxes","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"format":"uuid","title":"Profile Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetProfileMailboxesSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderProfileReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Set a profile's mailboxes","tags":["senders"]}},"/sequences/":{"get":{"description":"Name, status, senders, and the rollup metrics (contacts, sent, reply rate) from the workspace's cached stats, served at once whatever their age. When they are more than five minutes old a refresh runs in the background and stats_refreshing is true: read the list again a few seconds later for the newer numbers. Only a workspace whose stats have never been built waits for them. stats_refreshed_at is when the numbers were computed; None only when they have never been built and could not be built on this request (for example, another request was building them). What holds a running sequence (hold, such as the tasks waiting for approval) is read live on every request, never from the cached stats, unless include_holds is false. Each sequence says whether the person asking starred it and when they last opened it: both are that person's own. `favorites` keeps only the sequences they starred; `recent` keeps only the ones they opened, the latest open first, at most 20. An API key has no person, so both read empty for it.","operationId":"list_sequences","parameters":[{"in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Search"}},{"in":"query","name":"favorites","required":false,"schema":{"default":false,"title":"Favorites","type":"boolean"}},{"in":"query","name":"recent","required":false,"schema":{"default":false,"title":"Recent","type":"boolean"}},{"description":"Read what holds each running sequence. False leaves every `hold` empty and answers much faster: for a caller that needs only the sequences themselves, such as a picker.","in":"query","name":"include_holds","required":false,"schema":{"default":true,"description":"Read what holds each running sequence. False leaves every `hold` empty and answers much faster: for a caller that needs only the sequences themselves, such as a picker.","title":"Include Holds","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceListReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List sequences","tags":["sequences"]},"post":{"description":"Creates a draft. With `proposal_id`, the draft is made from a tailored proposal (POST /sequences/proposals/): already on the campaign chosen for its audience, with its senders and audience. Otherwise it starts on the chosen starter, configured afterwards and checked at launch. When the workspace has exactly one sender, it is added.","operationId":"create_sequence","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"423":{"description":"The proposal's campaign is still being tailored."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a sequence","tags":["sequences","mcp-searchable-tool"]}},"/sequences/analytics/leaderboard/":{"get":{"description":"Every mailbox's sent, reply and bounce numbers under its sender, worst performer first, so the one broken mailbox stands out. Served at once from the cached rollup, whatever its age; refreshed_at says how old. When it is more than five minutes old a refresh runs in the background and refreshing is true: read it again a few seconds later for the newer board.","operationId":"get_sender_leaderboard","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderLeaderboardReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Sender leaderboard","tags":["sequences"]}},"/sequences/analytics/summary/":{"get":{"description":"The funnel, the rates and a per-day series, for one sequence or the whole workspace. There is deliberately no open or click rate: we send plain text and there is nothing to instrument. A preset range is served at once from the workspace's cached stats, whatever their age; refreshed_at says when they were computed. When they are more than five minutes old a refresh runs in the background and refreshing is true: read them again a few seconds later for the newer numbers. A start or end window is computed live, with refreshed_at None.","operationId":"get_sequence_analytics","parameters":[{"in":"query","name":"sequence_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Sequence Id"}},{"in":"query","name":"range","required":false,"schema":{"default":"all","pattern":"^(all|week|month)$","title":"Range","type":"string"}},{"in":"query","name":"start","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Start"}},{"in":"query","name":"end","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"End"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceAnalyticsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Outreach analytics","tags":["sequences"]}},"/sequences/autospintax/":{"post":{"description":"Per-sentence rewrite proposals (the original plus two alternatives) for the author to accept or reject: the composer's Suggest versions with AI. The draft itself is never modified. Variable tokens survive verbatim. A sentence that already rotates, holds a [blank] to fill or that the spam check flags gets none.","operationId":"autospintax","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutospintaxRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutospintaxResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"description":"The model could not propose rotations right now."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Propose spintax rotations for a drafted message","tags":["sequences"]}},"/sequences/email-steps-suggestion/":{"get":{"description":"Reads a table's column names and suggests which hold a subject line, a first email and follow-ups, such as an Email writer's Subject, First email, Second email and Last email. Takes a table; returns column ids, any of them empty. Builds nothing: the steps are made when a sequence's graph is saved.","operationId":"suggest_email_steps","parameters":[{"in":"query","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailStepColumnsSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest email steps from a table's written emails","tags":["sequences"]}},"/sequences/mapping-suggestion/":{"get":{"operationId":"suggest_mapping","parameters":[{"in":"query","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColumnMappingSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest a column mapping for a table","tags":["sequences"]}},"/sequences/proposals/":{"post":{"description":"The first half of making a sequence the way New sequence does: choose the table (or a saved view of it, or chosen rows) and who sends it, and the library campaign that fits those people is chosen, its steps' instructions rewritten for the company and its goal chosen, in the background, about a minute, BEFORE anything is made. Pass the person's own words about what it is for as `intent`, or a `campaign_key` to run a particular campaign. Poll the proposal until `in_flight` is false, then create the sequence with POST /sequences/ and `proposal_id` (and `goal`, to change it). Free, up to a daily number of tailorings per workspace; a proposal over it, or with no business context to tailor from, answers at once with the reason and still makes a sequence on the standard campaign.","operationId":"propose_sequence","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceProposalCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceProposalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Propose a sequence and tailor its campaign","tags":["sequences","mcp-searchable-tool"]}},"/sequences/proposals/{proposal_id}/":{"delete":{"description":"For a proposal nobody will make a sequence from: stops its tailoring if it is still running and deletes the proposal. A proposal that already made its sequence is kept as the record of how it was made, and this does nothing.","operationId":"discard_sequence_proposal","parameters":[{"in":"path","name":"proposal_id","required":true,"schema":{"format":"uuid","title":"Proposal Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceProposalDiscardReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Discard a proposed sequence","tags":["sequences"]},"get":{"description":"The proposal's audience and senders, whether its campaign is still being tailored (`in_flight`, with `stage`), and once it lands the campaign chosen, its brief (who, why now, the angle) and a note per step. No campaign after it lands means the sequence starts on the standard one; `reason` says why.","operationId":"get_sequence_proposal","parameters":[{"in":"path","name":"proposal_id","required":true,"schema":{"format":"uuid","title":"Proposal Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceProposalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read a proposed sequence and its tailoring","tags":["sequences","mcp-searchable-tool"]}},"/sequences/proposals/{proposal_id}/tailor/":{"post":{"description":"Tailor a proposal again before the sequence is made: another campaign from the library by `campaign_key`, or other words of the person's as `intent`. What was asked before stands unless something new is given.","operationId":"retailor_sequence_proposal","parameters":[{"in":"path","name":"proposal_id","required":true,"schema":{"format":"uuid","title":"Proposal Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTailorSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceProposalReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The proposal already made its sequence."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Tailor a proposed sequence again","tags":["sequences"]}},"/sequences/sequence-templates/":{"get":{"operationId":"list_sequence_templates","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SequenceTemplateReadSchema"},"title":"Response List Sequence Templates","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List reusable sequence templates","tags":["sequences"]},"post":{"operationId":"save_sequence_template","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTemplateCreateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTemplateReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"A template with this name already exists."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Save a detached sequence template","tags":["sequences"]}},"/sequences/sequence-templates/{template_id}/":{"delete":{"operationId":"delete_sequence_template","parameters":[{"in":"path","name":"template_id","required":true,"schema":{"format":"uuid","title":"Template Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a template","tags":["sequences"]}},"/sequences/sequence-templates/{template_id}/use/":{"post":{"operationId":"instantiate_sequence_template","parameters":[{"in":"path","name":"template_id","required":true,"schema":{"format":"uuid","title":"Template Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a draft from a template, with fresh audience and senders","tags":["sequences"]}},"/sequences/spam-check/":{"post":{"description":"Rule-based findings on the given subject and body: risky phrases, link density, shouting, punctuation, length, and for an email the variables, emoji and blanks left from a starter, with what passes. The text is the composer's: {{Column}} is a variable and {{spin: a | b}} a rotation. Deterministic and free; pure text analysis, nothing is stored.","operationId":"spam_check","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpamCheckRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpamCheckResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Check a drafted message for deliverability risks","tags":["sequences"]}},"/sequences/templates/":{"get":{"description":"The workspace's reusable email templates, newest-first, and the built-in ones every workspace has for a sequence's email steps.","operationId":"list_message_templates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageTemplateListReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List saved email templates","tags":["sequences"]},"post":{"description":"Save a drafted subject and body (as segments, so variables and AI/spintax tokens survive reuse) into the workspace library.","operationId":"create_message_template","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageTemplateCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageTemplateReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Save an email template","tags":["sequences"]}},"/sequences/templates/{template_id}/":{"delete":{"operationId":"delete_message_template","parameters":[{"in":"path","name":"template_id","required":true,"schema":{"format":"uuid","title":"Template Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete an email template","tags":["sequences"]},"patch":{"description":"Rename and/or move a template between composer scopes.","operationId":"update_message_template","parameters":[{"in":"path","name":"template_id","required":true,"schema":{"format":"uuid","title":"Template Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageTemplateUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageTemplateReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rename or re-scope an email template","tags":["sequences"]}},"/sequences/trash/":{"get":{"description":"The workspace's sequences in Trash, newest move first, or by name. Each can be restored (POST /sequences/{id}/restore/), or deleted for good early (DELETE /sequences/{id}/purge/); otherwise Trash deletes it 30 days after it went there.","operationId":"list_trashed_sequences","parameters":[{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListTrashedSequencesFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForDeletedAtName","default":"deleted_at","enum":["deleted_at","name"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TrashedSequenceReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List sequences in Trash","tags":["sequences"]}},"/sequences/trash/{sequence_id}/":{"get":{"description":"One sequence in Trash, as the Trash listing shows it: what a link to a sequence that answers 404 \"Sequence is in Trash\" reads to offer its restore.","operationId":"get_trashed_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashedSequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found in Trash."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a sequence in Trash","tags":["sequences"]}},"/sequences/{sequence_id}/":{"delete":{"description":"Move a sequence to Trash. A running one is paused first. Its contacts stop at once and are free for other sequences, and anything it had waiting for approval or queued on LinkedIn is withdrawn. Nothing else is lost: its steps, settings and history stay, and so do its status and messages columns on the audience table. Its name is freed at once.\n\nRestore it with POST /sequences/{id}/restore/; it comes back paused. Trash keeps it for 30 days, then deletes it for good, as DELETE /sequences/{id}/purge/ does at once.","operationId":"delete_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Move a sequence to Trash","tags":["sequences"]},"get":{"operationId":"get_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found. The detail is \"Sequence is in Trash\" for one in Trash, which GET /sequences/trash/{sequence_id}/ reads, and \"Sequence not found\" otherwise."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a sequence with its graph","tags":["sequences","mcp-searchable-tool"]},"patch":{"description":"The autosave PATCH; carries expected_updated_at as the concurrency guard. Allowed while the sequence is running, because every field here is read fresh by the engine on the next tick. A sending_window is checked whatever the status and refused with a 422 naming the part at fault; an explicit null clears it.","operationId":"update_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The sequence changed elsewhere. Reload before saving."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a sequence's settings","tags":["sequences"]}},"/sequences/{sequence_id}/agent/campaign/":{"delete":{"description":"Stop tailoring the sequence: a tailored draft goes back to the standard campaign's steps with the library's own instructions; a launched one keeps its steps and loses any brief and notes an older tailoring gave it. Nothing tailors it again until someone asks. Written as a new version of the agent, so it can be undone.","operationId":"reset_sequence_campaign","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTailoringReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The sequence changed elsewhere. Reload before saving."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Use the standard instructions","tags":["sequences","mcp-searchable-tool"]}},"/sequences/{sequence_id}/agent/copy-from/":{"post":{"description":"Give this sequence's outbound agent the setup of another sequence's agent: its personality, goal, call to action, language and translation choice, model, research switch, reply prompt and whether it drafts replies. This sequence's per-step prompts stay as they are, because they belong to its own steps. Takes the id of the sequence to copy from and returns this sequence's agent. The copy is written as a new version of the agent, so it can be undone from the agent's version history.","operationId":"copy_outbound_agent_setup","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceAgentCopySchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Asked with an API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Copy another sequence's agent setup","tags":["sequences"]}},"/sequences/{sequence_id}/agent/examples/":{"get":{"description":"Read saved samples or reviewed messages for this sequence's agent.\n\nOne preview writes a contact's whole sequence and saves each step's draft\nunder that step's ``slot_key``, so the steps of a previewed contact have\nsamples here: every one the agent found words for.","operationId":"list_sequence_agent_examples","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"query","name":"view","required":false,"schema":{"default":"samples","enum":["samples","reviewed"],"title":"View","type":"string"}},{"in":"query","name":"record_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Record Id"}},{"in":"query","name":"slot_key","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Slot Key"}},{"in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Cursor"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceAgentExamplesReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List saved samples or reviewed messages for a sequence's agent","tags":["sequences"]}},"/sequences/{sequence_id}/agent/preview/stream/":{"post":{"description":"Have the sequence's agent write one contact's whole sequence as a preview, in one call the way the real first send writes it (each later step reads the drafts before it), researching the contact on the web the way the real first message would, and stream its work as Server-Sent Events. The `result` frame carries the step asked for; each of the contact's other agent-written steps on their path that comes back with words is saved as a sample of its own step, read through the sequence's agent examples. A step that only runs on a branch this contact does not take, or a contact already sent a message, gets the asked step alone. Nobody receives the preview and it costs no credits; it counts against the workspace's daily preview allowance once for each step it writes, where a preview that researches counts for more than one that does not. The agent researches only when its research switch is on, the contact has never been researched and the workspace has credits; otherwise it writes from the contact's row and what earlier research found. The same preview asked for again the same day is shown again at no further cost, unless `fresh` asks for another, which writes the whole sequence again from its first step.\n\nThe first frame is `turn`, carrying the `preview_id` a Stop is sent to; then a `step` frame for each thing the agent did (searching, reading pages, writing, checking), each with its measured duration; then one `result` frame with the asked step's message, the agent's confidence, the independent quality score, its reasoning and what the checks found.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `not_found` when the sequence, the step or the contact is gone, `limit` when today's preview allowance is spent, `stopped` when the caller stopped it, `ai_unavailable` when the agent's model cannot be asked right now (nothing about the workspace; a retry does not help until it is back), and no reason for anything else.\n\nClosing the connection does not stop the preview; the Stop route does.","operationId":"stream_outbound_agent_preview","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceAgentPreviewRequestSchema"}}},"required":true},"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SequenceAgentPreviewReadSchema","type":"string"}}},"description":"A stream of Server-Sent Events; the final `result` frame's `data` is the asked step's preview message."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Preview one contact's agent-written message, streaming the research","tags":["sequences"]}},"/sequences/{sequence_id}/agent/preview/{preview_id}/stop/":{"post":{"description":"Ask the preview streaming under `preview_id` (its first frame) to stop. Cooperative: the preview checks before each model call and while the model writes, and ends there, its stream closing on an `error` frame with reason `stopped`. A preview that has already finished is unaffected.","operationId":"stop_outbound_agent_preview","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"preview_id","required":true,"schema":{"format":"uuid","title":"Preview Id","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceAgentPreviewStopResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Stop a preview that is being written","tags":["sequences"]}},"/sequences/{sequence_id}/agent/tailor/":{"post":{"description":"Tailor a draft to its audience, in the background (about a minute): choose the library campaign that fits the audience best, rewrite each of its steps' instructions for the company from the business context, and set its goal unless a person set one. Replaces the draft's steps with the campaign's, edits included. Pass the person's own words about what the campaign is for as `intent`, or a `campaign_key` to run a particular campaign. A launched sequence keeps its steps and cannot be tailored. Free, up to a daily number per workspace. Returns where tailoring stands; poll the tailoring read until it settles.","operationId":"tailor_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTailorSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTailoringReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"Nothing to tailor (no audience, or no step the agent writes), or the sequence is launched."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Tailor the sequence to its audience","tags":["sequences","mcp-searchable-tool"]}},"/sequences/{sequence_id}/agent/tailoring/":{"get":{"description":"The campaign from the library the sequence runs, why tailoring chose it and the goal it set, and the newest tailoring job with its status and the steps its run has taken so far. A sequence an older tailoring wrote for also carries that tailoring's brief (who it writes to, why now, the angle) and one note per step. Poll while `in_flight` is true: launch waits for it.","operationId":"get_sequence_tailoring","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTailoringReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read how the sequence is tailored to its audience","tags":["sequences","mcp-searchable-tool"]}},"/sequences/{sequence_id}/agent/training/":{"get":{"operationId":"get_sequence_training","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingLatestSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read the latest contact training session","tags":["sequences"]},"post":{"description":"Writes every message of the sequence for each contact, free, as the AI writing tab shows them. The contacts join the sequence's open writing check, so the ones already written stay and can be read again without writing; a contact already in it is written again, and its Looks good no longer pins its old words. A writing check holds ten contacts: past that, the oldest nobody rated makes room.","operationId":"start_sequence_training","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingStartSchema"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Write complete sequences for up to ten contacts","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/contacts/":{"get":{"operationId":"list_sequence_training_contacts","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}},{"in":"query","name":"limit","required":false,"schema":{"default":25,"maximum":100,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingAudienceSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List contacts available for sequence training","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/next/":{"get":{"description":"The next contact in the audience's order, after `after`, that nobody has given Looks good or a note, or skipped, in the open run, whose thread holds no words a person pinned (their edit, or a message approved on Tasks), whose thread was not marked Looks good before, and whom the sequence can reach; from the top again when the end is reached. One email marked Looks good on its own from the Builder leaves the contact's other emails to be read. Null when there is nobody left. Writes nothing.","operationId":"next_sequence_training_contact","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"query","name":"after","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"After"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingNextSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Name the contact to read after this one","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/previews/":{"post":{"description":"Makes the threads already written as free previews for up to ten contacts those contacts' threads on the sequence's AI writing tab, word for word: nothing is written again, nothing is charged and no preview allowance is spent, so each contact's thread there shows the emails the previews showed and Looks good can be given on them. A step with no current preview shows as not written. The contacts join the sequence's open writing check; one already in it with the same words keeps its verdict. This never writes: the start route is what writes a thread. The answer names any kept thread written before the plain-words check that uses banned jargon or copies the business context, so it can be written again.","operationId":"add_previews_to_sequence_training","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingAdoptSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingPreviewsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Keep threads already written on the AI writing tab","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/{session_id}/apply/":{"post":{"description":"The agent's instructions take the lesson (its next version), and the rewrite becomes the noted contact's thread, marked Looks good, so it is what sends. Every thread of the sequence already marked Looks good keeps its words across the new version. The run stays open on the new version; threads written ahead under the old instructions that nobody read leave it, and are written again when opened. A rewrite is kept whole: slot_keys, when sent, must name every change. Repeating the call is a no-op.","operationId":"apply_sequence_training","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingApplySchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Keep the rewrite and the lesson that wrote it","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/{session_id}/close/":{"post":{"operationId":"close_sequence_training","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingActionSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Close training and keep its reviews","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/{session_id}/contacts/{record_id}/":{"patch":{"operationId":"review_sequence_training_contact","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}},{"in":"path","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReviewSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Review a contact's complete training sequence","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/{session_id}/contacts/{record_id}/feedback/":{"post":{"description":"The one way to say what should change on the AI writing tab. The agent works out the change to its instructions the note asks for, and writes this contact's whole thread again with it: the rewrite comes back on each message as proposed_subject, proposed_body and proposed_send, with the lesson in the proposal's summary. Nothing about the agent changes until the rewrite is kept with the apply route; discard drops it. A note on a rewrite already shown refines the lesson it tried. Given while another contact is being written, the rewrite is worked out once that write lands. The contact's earlier Looks good no longer pins its words. Spends one daily assistant turn, and the rewritten messages count against the daily preview cap.","operationId":"give_sequence_training_feedback","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}},{"in":"path","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingFeedbackSchema"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Say what should change in a contact's messages, and have them rewritten","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/{session_id}/discard-changes/":{"post":{"description":"Drops the rewrite and the lesson that wrote it. The thread stays as it was written, its notes are kept as discarded (the agent never learns them) and the contact waits for a verdict again. Closing the whole run is the close route.","operationId":"discard_sequence_training_changes","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingActionSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Discard the rewrite","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/{session_id}/finish/":{"post":{"description":"A note (the feedback route, or Needs work with a note on the review route) starts its own rewrite, so this answers with the run as it stands while the rewrite is being worked out or waits, and works it out again for a note whose rewrite failed.","operationId":"finish_sequence_training","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingActionSchema"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Work out the rewrite for the note waiting","tags":["sequences"]}},"/sequences/{sequence_id}/agent/training/{session_id}/retry/":{"post":{"operationId":"retry_sequence_training","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"format":"uuid","title":"Session Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingActionSchema"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTrainingReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, audience contact, or session not found"},"409":{"description":"Sequence, agent, or training revision changed"},"422":{"description":"Invalid selection, feedback, or training action"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Retry failed training messages","tags":["sequences"]}},"/sequences/{sequence_id}/agent/write-from/":{"get":{"description":"The research and AI columns of the sequence's audience table, whose answers reach the agent as angles the team prepared for each contact: a Use AI column, a built-in research agent, or a field promoted out of one. Every one is used unless its id is in the agent's `write_from_excluded_column_ids`; the list includes those, so one taken out can be put back by changing that list on the agent.","operationId":"list_write_from_columns","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceWriteFromReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the audience columns the agent writes from","tags":["sequences"]}},"/sequences/{sequence_id}/audience/":{"put":{"description":"A draft adds no column to the table: the sequence-status column arrives at launch, so a table picked and then abandoned is left as it was. A sequence that has launched before gets its column on the new table straight away.\n\nBinding a draft ENROLS from the audience before returning, so the Contacts tab is populated the moment the choice is made rather than at the next sweep. A draft's enrolments sit ACTIVE and unsent: the send tick only ever claims rows belonging to a RUNNING sequence. A sequence that has launched answers as soon as the change is saved, and its contacts follow in the background within seconds: those the new audience leaves out stop, and new matches join.","operationId":"put_audience","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiencePutSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The sequence changed elsewhere. Reload before saving."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"423":{"description":"The sequence is running. Pause it to rebind the audience."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Set the audience: table, view, column mapping","tags":["sequences"]}},"/sequences/{sequence_id}/audience/mapping/":{"patch":{"description":"Allowed while the sequence is running, unlike setting the audience: a remap within the same table orphans no enrolment, whereas rebinding does.","operationId":"patch_column_mapping","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColumnMappingUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The audience is not configured yet."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Remap the audience columns without rebinding the table","tags":["sequences"]}},"/sequences/{sequence_id}/audience/preview/":{"get":{"description":"The reassurance banner: \"4,120 rows, 3,890 will be enrolled\", and why not.","operationId":"preview_audience","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiencePreviewReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The audience is not configured yet."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Preview what the audience resolves to","tags":["sequences"]}},"/sequences/{sequence_id}/audience/replacement-preview/":{"get":{"description":"Reads the table or saved view the sequence would draw from, the way enrolment would after the change, and says for each choice (keep existing journeys, or start them fresh) how many contacts are added, removed and not changed. On the same table, keeping journeys applies the new filter: contacts it no longer selects stop. Writes nothing.","operationId":"preview_audience_replacement","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"query","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"query","name":"view_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"View Id"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudienceReplacementPreviewReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Preview a replacement audience before choosing how existing journeys continue","tags":["sequences"]}},"/sequences/{sequence_id}/audit-logs/":{"get":{"description":"Who created, edited, launched, paused and resumed this sequence, newest first. A pause carries its reason, so an automatic stop (no sender could send, the balance ran out, too many bounced) explains itself.\n\nKept indefinitely, and deliberately not tied to the sequence by a foreign key, so the record of a deletion outlives what it describes.\n\nA roster change the AI Assistant made through a granted workspace action lands as `assistant_applied`, naming the proposal it came from, so the change and the card that asked for it read together.","operationId":"list_sequence_audit_logs","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForCreatedAt","default":"created_at","enum":["created_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SequenceAuditLogReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Sequence not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List a sequence's activity","tags":["sequences"]}},"/sequences/{sequence_id}/budget/":{"get":{"operationId":"get_sequence_budget","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceBudgetReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read sequence spending and reservations","tags":["sequences"]}},"/sequences/{sequence_id}/capacity/":{"get":{"description":"Today's daily capacity summed across every connected mailbox on the sequence's senders, the same calculation behind the workspace capacity tile and the launch pre-flight. `sends_email` says whether any of it applies: a LinkedIn-only sequence sends no email.","operationId":"get_sequence_capacity","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceCapacityReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the combined send capacity of the sequence's assigned senders","tags":["sequences"]}},"/sequences/{sequence_id}/changes/apply/":{"post":{"operationId":"apply_sequence_changes","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceChangesSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, sender, audience, or writing setup not found."},"409":{"description":"Configuration changed or review is stale."},"422":{"description":"Proposed configuration is invalid."},"423":{"description":"This action requires pausing the sequence."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Apply the reviewed changes atomically","tags":["sequences"]}},"/sequences/{sequence_id}/changes/preview/":{"post":{"operationId":"preview_sequence_changes","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceChangesSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceChangesPreviewSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"Sequence, sender, audience, or writing setup not found."},"409":{"description":"Configuration changed or review is stale."},"422":{"description":"Proposed configuration is invalid."},"423":{"description":"This action requires pausing the sequence."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Review proposed live changes","tags":["sequences"]}},"/sequences/{sequence_id}/changes/step-preview/":{"post":{"description":"The step as the contact would get it once the change set is applied, applying nothing and saving nothing. Nothing is written while the changes leave the step's words as they are or the contact keeps the words they have (`changed` false), or when another contact of `candidate_record_ids` is offered in place of one the changes do not reach. A step the agent writes is written again from the changes, spending one of the day's free previews per step written; the words are kept for 30 minutes for this contact and these changes, so another step's Preview and a test send read them and spend nothing.","operationId":"preview_step_with_changes","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceChangesStepPreviewSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceChangesStepPreviewReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"The sequence, the step, the contact or a writing setup is gone."},"409":{"description":"The audience is not configured yet."},"422":{"description":"The changes set an Effort the catalog does not offer (`model_key`), or the agent wrote nothing usable with them (`step_id`, error type `draft_not_written`)."},"429":{"description":"Today's free agent-written previews are spent."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Preview one step for one contact with the waiting changes","tags":["sequences"]}},"/sequences/{sequence_id}/changes/test-send/":{"post":{"description":"A real test email of the step as it will send once the change set is applied, applying nothing: real mailbox, real signature, variables resolved; free of credits and analytics. A step the agent writes goes out in the words its Preview wrote for this contact and these changes, kept for 30 minutes; only when there are none is it written, spending one of the day's free previews per step written.","operationId":"test_send_with_changes","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceChangesTestSendSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"description":"The sequence, the step, the contact, the mailbox or a writing setup it reads is gone."},"409":{"description":"The audience is not configured yet, or the real send would skip this contact (a missing column), or hold the agent's words for a person (a defect such as stray formatting)."},"422":{"description":"The changes set an Effort the catalog does not offer (`model_key`), or the agent wrote nothing usable with them (`step_id`, error type `draft_not_written`)."},"429":{"description":"Today's free agent-written previews are spent."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"The mailbox could not send."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Send one step as a test email with the waiting changes","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/":{"get":{"description":"Newest-first unless sorted; each row names why it is where it is. 'group' lists one tab of the Audience tab (In progress, Needs approval, Paused, Done, Blocked), which get_audience_eligibility counts over the whole roster and count_sequence_contacts_per_group under the same filters. 'status' orders contacts the way the Status column reads them, first in line on top (on LinkedIn now, then everyone with a next move by when it happens, then Needs approval, then everyone done); 'status_desc' reverses it. Status, stop reason, search and the added-date range all filter server-side, so 'total' counts what the filter matched rather than the whole sequence.","operationId":"list_sequence_contacts","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"query","name":"status","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EnrolmentStatus"},{"type":"null"}],"title":"Status"}},{"in":"query","name":"statuses","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/EnrolmentStatus"},"type":"array"},{"type":"null"}],"title":"Statuses"}},{"in":"query","name":"stop_reasons","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/StopReason"},"type":"array"},{"type":"null"}],"title":"Stop Reasons"}},{"in":"query","name":"exclude","required":false,"schema":{"default":false,"title":"Exclude","type":"boolean"}},{"in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Search"}},{"description":"Only the contacts under this tab of the Audience tab, as get_audience_eligibility's 'groups' counts them, or count_sequence_contacts_per_group's under the same filters.","in":"query","name":"group","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ContactGroup"},{"type":"null"}],"description":"Only the contacts under this tab of the Audience tab, as get_audience_eligibility's 'groups' counts them, or count_sequence_contacts_per_group's under the same filters.","title":"Group"}},{"in":"query","name":"sort","required":false,"schema":{"$ref":"#/components/schemas/EnrolmentSort","default":"created_desc"}},{"in":"query","name":"created_from","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created From"}},{"in":"query","name":"created_to","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created To"}},{"in":"query","name":"limit","required":false,"schema":{"default":100,"maximum":500,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolmentListReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List a sequence's contacts","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/breakdown/":{"get":{"description":"How many contacts were added, are in progress and have finished, with every reason a contact was not sent to.","operationId":"get_contacts_breakdown","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsBreakdownReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Contacts breakdown","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/bulk-journey/":{"post":{"description":"The Audience tab's bulk actions, over the contacts a person ticked: listed ids, or scope='all' for every contact the given filters match, less any excluded_ids. Each contact is judged on its own and one the action cannot apply to is skipped rather than failing the batch, because a selection is rarely uniform: 'changed' reports how many actually took it. 'resume' covers both waking a paused contact and undoing a reply stop; neither ever restarts a contact at step 1, and either finishes a wait the contact was in. 'send_now' makes a waiting contact's next step due now instead of when its wait ends; pacing, the daily cap and approvals still apply.","operationId":"bulk_journey_contacts","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkJourneyContactsSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkJourneyContactsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Stop, pause, resume, retry or send now for many contacts","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/bulk-remove/":{"post":{"description":"Removes the listed contacts, or with scope='all' every contact the given filters match, less any excluded_ids. The set is resolved on the server, never from a client-side id list, so the action covers every match across pages. Each removal keeps the durable single-remove semantics.","operationId":"bulk_remove_contacts","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRemoveContactsSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRemoveContactsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Remove many contacts from the sequence","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/eligibility/":{"get":{"description":"Judges the sequence's contacts as the Audience tab counts them: how many were added and checked, how many a step can reach, how many are blocked and why, a sample of contacts per reason, and how many sit under each tab of the roster (In progress, Needs approval, Paused, Done, Blocked). 'capped' says the roster is longer than one read checks. list_sequence_contacts' 'group' lists the contacts under one tab.","operationId":"get_audience_eligibility","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudienceEligibilityReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Audience eligibility and actionable reasons","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/groups/":{"get":{"description":"How the contacts matching a search or filter split across the Audience tab's tabs (In progress, Needs approval, Paused, Done, Blocked), judged as list_sequence_contacts' 'group' lists them under the same filters, so each count is the length of that tab's filtered list. 'total' counts every match; 'capped' says more contacts match than one read judges. The page's tabs read it while its search box or a filter is on; get_audience_eligibility counts the whole roster.","operationId":"count_sequence_contacts_per_group","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"query","name":"statuses","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/EnrolmentStatus"},"type":"array"},{"type":"null"}],"title":"Statuses"}},{"in":"query","name":"stop_reasons","required":false,"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/StopReason"},"type":"array"},{"type":"null"}],"title":"Stop Reasons"}},{"in":"query","name":"exclude","required":false,"schema":{"default":false,"title":"Exclude","type":"boolean"}},{"in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"title":"Search"}},{"in":"query","name":"created_from","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created From"}},{"in":"query","name":"created_to","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created To"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsPerGroupReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count the contacts a filter matches under each tab","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/resume-mailbox-stops/":{"post":{"description":"For a mailbox deleted, or a sender taken off the sequence, by mistake and then put back: resumes every contact of this sequence stopped because their mailbox could no longer send, each at the step it stopped on. A contact due an email whose mailbox still cannot send for the sequence stays stopped; one standing on a LinkedIn step or a check goes on, and stops again at their next email.","operationId":"resume_mailbox_stopped_contacts","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResumeMailboxStopsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Resume every contact a removed mailbox stopped","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/resume-out-of-office/":{"post":{"description":"Brings back every contact whose thread reads out-of-office: a contact snoozed to a stated return date is due now, and a contact a misclassified auto-responder stopped as a reply picks up where they stopped. Either finishes a wait they were in first. Idempotent.","operationId":"resume_out_of_office_contacts","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResumeOutOfOfficeResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Resume every out-of-office contact","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/retry-interrupted/":{"post":{"description":"Re-queues every FAILED contact at the exact step that broke. A failure preserves its step pointer, so a retry is a re-attempt, never a restart. A failed contact another live sequence has taken since stays failed here and is counted in `in_other_sequence`. Idempotent: a second call retries nothing.","operationId":"retry_interrupted_contacts","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryInterruptedResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Retry every interrupted contact","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/{enrolment_id}/":{"delete":{"description":"Stops the contact and keeps them out: enrolment sync skips a row that already has an enrolment, so this survives continuous enrolment instead of being undone at the next pass.","operationId":"remove_enrolment","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"enrolment_id","required":true,"schema":{"format":"uuid","title":"Enrolment Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolmentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Remove one contact from the sequence","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/{enrolment_id}/history/":{"get":{"description":"Everything the sequence did to one contact, oldest first: the emails it sent with their subject and body, the LinkedIn actions it ran with their message, the branch each condition took, and each step it moved them past without doing it, with why (no email address, an email verdict the sequence does not send to, no LinkedIn URL).\n\nAssembled from stores that each remember a different part. The send fence knows an email was accepted and when; the send log knows what it said; the action queue is both at once for LinkedIn; the condition ledger knows which way a branch went, and the skip ledger which steps were passed, because the engine moves the pointer and forgets.\n\nupcoming_skip says whether the step the contact waits on will be skipped once they reach it, read from their row as it is today.\n\nWhere a step went through the approval queue, the entry also says what was decided, when, and by whom, as a name. A rejected email appears only this way: it never reached the send fence.\n\nThe contact's own part is there too: their reply, with what they wrote and the inbox conversation it opens, and the email a bounce came back for. Beside the timeline, every filled column of their audience row.","operationId":"get_contact_history","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"enrolment_id","required":true,"schema":{"format":"uuid","title":"Enrolment Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactHistoryReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"One contact's history in this sequence","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/{enrolment_id}/move/":{"post":{"description":"Move to another sequence, all or nothing: the contact leaves this sequence only when the target takes them. When the target cannot (no address it can use, the do-not-contact list, the recontact rule, already in it, a different audience table) the answer is a 422 whose message says why, and the contact stays here untouched. Returns the contact's place in THIS sequence, now stopped.","operationId":"move_enrolment","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"enrolment_id","required":true,"schema":{"format":"uuid","title":"Enrolment Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveContactRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolmentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The target sequence would not take the contact; they stay here."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Move one contact to another sequence","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/{enrolment_id}/pause/":{"post":{"description":"Holds an in-flight contact exactly where it stands. Paused contacts are never claimed by the engine, keep their step and their one-live-sequence slot, and a reply or unsubscribe still stops them. Valid only for a contact currently active or claimed.","operationId":"pause_enrolment","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"enrolment_id","required":true,"schema":{"format":"uuid","title":"Enrolment Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolmentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The enrolment is not in a pausable/unpausable state."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Pause one contact","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/{enrolment_id}/resume/":{"post":{"description":"Undoes a stop a person can take back. A reply stop (an auto-responder, or a bounce misclassified as a reply) and a mailbox_removed stop pick up exactly where they stopped; a cooldown stop starts at step 1. A mailbox_removed stop resumes only once the mailbox that emails the contact is back on the sequence. An unsubscribe or suppression stop is a compliance stop and is never resumable here.","operationId":"resume_enrolment","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"enrolment_id","required":true,"schema":{"format":"uuid","title":"Enrolment Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolmentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The enrolment is not stopped by a reply."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Resume one stopped contact","tags":["sequences"]}},"/sequences/{sequence_id}/contacts/{enrolment_id}/unpause/":{"post":{"description":"Wakes a paused contact at the step it stood on, never back at step 1: due when the wait it was paused in ends, as that step's wait stands now, or immediately if it was not waiting. Valid only for a paused contact; a reply-stopped contact resumes through the resume route instead.","operationId":"unpause_enrolment","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"enrolment_id","required":true,"schema":{"format":"uuid","title":"Enrolment Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolmentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"The enrolment is not in a pausable/unpausable state."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Resume one paused contact","tags":["sequences"]}},"/sequences/{sequence_id}/discard/":{"post":{"description":"Deletes a draft only while it is exactly as New sequence created it: the name it was given, no audience, no senders and nothing written. Any other sequence is left as it is and `discarded` comes back false. The dashboard calls this when someone returns from a new sequence without changing it.","operationId":"discard_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceDiscardReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Discard a draft nobody has touched","tags":["sequences"]}},"/sequences/{sequence_id}/duplicate/":{"post":{"description":"Copies structure and settings, never the audience and never the stats.","operationId":"duplicate_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Duplicate a sequence","tags":["sequences"]}},"/sequences/{sequence_id}/email-verification/estimate/":{"get":{"description":"How many addresses in a sequence's audience have not been verified yet, and what verifying them would cost, before anything runs. The addresses are the audience rows with an email that the Verify email column has not checked: the same count the launch check's `emails_not_verified` finding carries. Free, and changes nothing. Quote `expected_credits`; `adds_column` says a Verify email column would be added over the sequence's email column first, and `maps_column` that the sequence would start reading its verdicts. Refused with a sentence to relay when every address is verified already, when no email column is mapped, or when verification is unavailable. verify_sequence_emails spends it.","operationId":"estimate_email_verification","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationEstimateReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Sequence not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Price verifying a sequence's emails","tags":["sequences","mcp-searchable-tool"]}},"/sequences/{sequence_id}/email-verification/verify/":{"post":{"description":"Check whether the addresses in a sequence's audience are deliverable, and have the sequence email only the ones whose verdict it accepts (valid alone unless the Audience tab or set_sequence_audience chose more). Spends credits: price it first with estimate_email_verification, over exactly the same addresses. Adds a Verify email column over the sequence's email column when the table has none, points the sequence's email deliverability at it, and runs it only on addresses it has not checked. Answers with the run: verdicts fill in row by row over the next minutes, and a contact's email step waits for theirs.","operationId":"verify_sequence_emails","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationRunReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Sequence not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Verify a sequence's emails","tags":["sequences","mcp-searchable-tool"]}},"/sequences/{sequence_id}/favorite/":{"put":{"description":"Set whether the CALLING USER has this sequence starred, which is what the Sequences list's Favorites holds. Per person: starring a sequence does not star it for a teammate.","operationId":"set_sequence_favorite","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceFavoriteUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceUserPrefsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Star or unstar a sequence","tags":["sequences"]}},"/sequences/{sequence_id}/funnel/":{"get":{"description":"Waiting, executed and failed counts per step, and the yes/no split per condition. Computed live rather than from the cached rollups, because being current is the point. `orphaned_executed` holds sends belonging to steps deleted from a running sequence, so the canvas totals still reconcile with the sequence's own sent count.","operationId":"get_sequence_funnel","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceFunnelReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Live per-node counts for the builder","tags":["sequences"]}},"/sequences/{sequence_id}/graph/":{"put":{"description":"Structural edits save immediately; the graph is validated before it lands. Allowed while the sequence is running: every contact follows the edited graph as a new contact would from where they stand. One who has done nothing on their step yet goes where the way they came in by now leads, so a step put in front of theirs reaches them first; a contact whose step is deleted goes on to the step that now follows it, or down the branch a deleted check kept; a step they already did is never sent again. A changed wait re-dates the contacts already waiting on it, from when their wait began. A contact who had finished at an end the edit connects to a step goes on to that step, its wait counted from when their last step finished, unless since then they replied, opted out, bounced, went on the do-not-contact list, answered or joined another sequence, were reached by one, left the audience, or lost their mailbox. A step whose words change is asked again with its new words wherever its old ones wait for approval, wait approved for the sending window or wait in a LinkedIn line no browser has started; a person's own edit of a contact's words is kept, and the agent writes its unsent, unedited messages for a step whose prompt changed again.","operationId":"put_graph","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceGraphPutSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The sequence changed elsewhere. Reload before saving."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Replace the sequence graph","tags":["sequences"]}},"/sequences/{sequence_id}/holds/":{"get":{"description":"Whether anybody on the sequence can move right now, and if not, why: every reason holding live contacts, worst first, with how many each holds and, for a LinkedIn reason, whose account it is. The Overview headline, the Audience banner, the header caption and each step card read this one answer.","operationId":"get_sequence_holds","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceHoldsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Why nothing is moving","tags":["sequences"]}},"/sequences/{sequence_id}/launch/":{"post":{"description":"Pre-flight must be clean. Launching creates the send-log table when the sequence has an email step, and runs the first enrolment sync inline, so contacts appear the moment the button is pressed. The contacts due now start straight away rather than on the engine's next minute: `starting_now` says how many, and `starts_at` says when the roster starts instead when the sending window is closed.","operationId":"launch_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceLaunchReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Pre-flight issues block the launch."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Launch a sequence","tags":["sequences"]}},"/sequences/{sequence_id}/message-performance/":{"get":{"description":"One row per non-condition step, in graph order. Email rows count accepted sends and attribute replies/bounces to the contact's last accepted send (the send log's own amendment rule); LinkedIn rows count succeeded actions and carry nulls where per-step attribution would be a guess.","operationId":"get_message_performance","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessagePerformanceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Per-step message performance","tags":["sequences"]}},"/sequences/{sequence_id}/missing-emails/estimate/":{"get":{"description":"How many contacts in a sequence's audience have no email yet, and what finding their work emails would cost, before anything runs. The contacts are the audience rows with no address in the email column that a Find work email lookup has not tried yet: the same count the launch check's `contacts_missing_email` finding carries. Free, and changes nothing. Quote `expected_credits`; `adds_column` says a Work email column would be added first. Refused with a sentence to relay when nobody is missing an email, when the table has no name and company columns to find one from, or when lookups are unavailable. find_missing_emails spends it.","operationId":"estimate_missing_emails","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingEmailsEstimateReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Sequence not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Price finding a sequence's missing work emails","tags":["sequences","mcp-searchable-tool"]}},"/sequences/{sequence_id}/missing-emails/find/":{"post":{"description":"Look up work emails for the contacts in a sequence's audience that have none, and send the sequence to the ones found. Spends credits: price it first with estimate_missing_emails, over exactly the same contacts. Adds a Work email column to the audience table when it has none, and runs it only on those contacts, never on a row that already has an address or was looked up before. When the sequence's email column is itself that column, found addresses land in it; when no email column is mapped, the Work email column becomes it; when the email column holds addresses of its own, a Default if empty column reads it first and the found email second, and the sequence reads that column once it has filled in. Answers with the run: emails fill in row by row over the next minutes, and contacts join a live sequence as theirs arrive.","operationId":"find_missing_emails","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingEmailsFindReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Sequence not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Find a sequence's missing work emails","tags":["sequences","mcp-searchable-tool"]}},"/sequences/{sequence_id}/pause/":{"post":{"description":"Scheduling stops immediately; every enrolment stays exactly where it is. Nothing is sent while it is paused: its queued LinkedIn steps leave every browser's line, approved or not, and only a step a browser was already handed may finish.","operationId":"pause_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Pause a sequence","tags":["sequences"]}},"/sequences/{sequence_id}/preflight/":{"get":{"description":"Every launch-blocking problem, addressed to the tab that fixes it.","operationId":"get_preflight","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PreflightIssueReadSchema"},"title":"Response Get Preflight","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Launch pre-flight issues","tags":["sequences"]}},"/sequences/{sequence_id}/purge/":{"delete":{"description":"Permanently delete a sequence that is already in Trash: its steps, settings, every contact's progress, its agent, and its status and messages columns on the audience table. Its history is kept. This cannot be undone. Only a sequence in Trash, so it is never the first thing that happens to a live one.","operationId":"purge_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found in Trash."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a sequence in Trash for good","tags":["sequences"]}},"/sequences/{sequence_id}/restore/":{"post":{"description":"Take a sequence out of Trash. A launched one comes back paused, and only Resume starts it again; a draft comes back a draft. Its contacts are taken back where they stood, in the background, unless another sequence took them meanwhile (contacts_held_elsewhere counts them: they stay stopped), they replied, or their row left the audience.\n\nFails while a live sequence has its name: rename one of the two first.","operationId":"restore_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceRestoreReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found in Trash."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Validation failed."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Restore a sequence from Trash","tags":["sequences"]}},"/sequences/{sequence_id}/resume/":{"post":{"description":"Every contact picks up from where they stopped; nothing restarts. Its held LinkedIn steps go back in line, and the approvals given while it was paused stand.","operationId":"resume_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Resume a paused sequence","tags":["sequences"]}},"/sequences/{sequence_id}/senders/":{"get":{"operationId":"get_sequence_senders","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceSendersReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the senders a sequence sends as","tags":["sequences"]},"put":{"description":"Replaces the whole set. A contact's first email goes from one of the chosen senders' connected mailboxes, and every later email from that same mailbox. Removing a sender from a launched sequence stops the live contacts its mailboxes email: no other mailbox emails them.","operationId":"put_sequence_senders","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceSendersPutSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceSendersReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Choose the senders a sequence sends as","tags":["sequences"]}},"/sequences/{sequence_id}/start-progress/":{"get":{"description":"How far a launch has got: `starting` counts the contacts due now plus those being worked on, and reaches 0 when the start is over; `tasks_waiting` counts this sequence's tasks waiting for someone's approval. Cheap enough to poll every two seconds right after a launch.","operationId":"get_sequence_start_progress","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceStartProgressReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Follow a sequence's start","tags":["sequences"]}},"/sequences/{sequence_id}/steps/{step_id}/looks-good/":{"post":{"description":"The Builder's Looks good on the one step it shows. The email saved for this contact at this step becomes what sends to them, until the agent's writing or the contact's row changes, and the AI writing tab marks it Looks good. The contact's other emails are left as they are. Writes nothing and spends nothing; marking an email whose mark still stands is a no-op. With `message_id`, the mark lands only on those words. Refused where the Builder offers no Looks good: a step a person writes, a person's own words, a step already sent to the contact, or a real email the agent already wrote for them. Needs work is given on the AI writing tab, where the note rewrites the thread.","operationId":"mark_step_looks_good","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"step_id","required":true,"schema":{"format":"uuid","title":"Step Id","type":"string"}},{"in":"query","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}},{"description":"The email on screen, as the step's preview answered it in `message_id`. Given, the mark is refused when the words saved for the contact are no longer those; left out, it marks whatever is saved now.","in":"query","name":"message_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The email on screen, as the step's preview answered it in `message_id`. Given, the mark is refused when the words saved for the contact are no longer those; left out, it marks whatever is saved now.","title":"Message Id"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderedMessageReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"Nothing is written for this contact at this step yet, the step is not the agent's, the words there are a person's own, the step already went to the contact or its real email is written, the email changed since `message_id` was read, the contact's row changed since it was written, or the audience is not configured."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Mark one email the agent wrote for a contact Looks good","tags":["sequences"]}},"/sequences/{sequence_id}/steps/{step_id}/override/":{"delete":{"operationId":"delete_message_override","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"step_id","required":true,"schema":{"format":"uuid","title":"Step Id","type":"string"}},{"in":"query","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"423":{"description":"The sequence is running."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Revert one contact to the step's template","tags":["sequences"]},"get":{"operationId":"get_message_override","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"step_id","required":true,"schema":{"format":"uuid","title":"Step Id","type":"string"}},{"in":"query","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MessageOverrideReadSchema"},{"type":"null"}],"title":"Response Get Message Override"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get one contact's hand-edited message for a step","tags":["sequences"]},"put":{"description":"Stores rendered text, not a template: variables, AI snippets and spintax are not re-resolved over an override. Pause a running sequence to edit.","operationId":"put_message_override","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"step_id","required":true,"schema":{"format":"uuid","title":"Step Id","type":"string"}},{"in":"query","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageOverridePutSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageOverrideReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"423":{"description":"The sequence is running."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Pin the exact message one contact receives","tags":["sequences"]}},"/sequences/{sequence_id}/steps/{step_id}/preview/":{"get":{"description":"Render one step exactly as one contact would receive it. On an agent-written step this shows the sample already saved for that contact and step when there is one; otherwise the agent writes the contact's whole sequence as a free preview, the way the real first send does, answers with this step and saves the others as samples. With `fresh` it writes the contact's whole sequence again instead of showing what was saved; a thread marked Looks good still shows the words that will send. With `write` false it writes nothing: it shows what is saved, and with nothing saved answers `written` false, as the Builder does when a contact is picked. Each step it writes counts against the workspace's daily preview allowance. Without `mailbox_id`, the sender's variables are filled in as the sequence's first sender's, the sender a preview writes as. With `mix` above 0, a typed step's rotations pick another combination of their versions, to read the email the way other contacts get it; 0 is the contact's own.","operationId":"preview_step","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"step_id","required":true,"schema":{"format":"uuid","title":"Step Id","type":"string"}},{"in":"query","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}},{"in":"query","name":"mailbox_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Mailbox Id"}},{"description":"Write this contact's messages again rather than show the ones already saved, as when someone asks for the emails to be written again.","in":"query","name":"fresh","required":false,"schema":{"default":false,"description":"Write this contact's messages again rather than show the ones already saved, as when someone asks for the emails to be written again.","title":"Fresh","type":"boolean"}},{"description":"False shows only what is already written for this contact and never writes or spends a preview; with nothing written the answer has `written` false.","in":"query","name":"write","required":false,"schema":{"default":true,"description":"False shows only what is already written for this contact and never writes or spends a preview; with nothing written the answer has `written` false.","title":"Write","type":"boolean"}},{"description":"0 shows each rotation's version as this contact gets it; another number picks another combination, as other contacts get it.","in":"query","name":"mix","required":false,"schema":{"default":0,"description":"0 shows each rotation's version as this contact gets it; another number picks another combination, as other contacts get it.","maximum":1000000,"minimum":0,"title":"Mix","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderedMessageReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The audience is not configured yet."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"description":"Today's free agent-written previews are spent."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Render a step for one contact","tags":["sequences"]}},"/sequences/{sequence_id}/steps/{step_id}/test-send/":{"post":{"description":"Real mailbox, real signature, variables resolved; free of credits and analytics. A LinkedIn step arrives as an email with its exact text and no signature.","operationId":"test_send","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"path","name":"step_id","required":true,"schema":{"format":"uuid","title":"Step Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"409":{"description":"The audience is not configured yet, or the real send would skip this contact (a missing column, or an agent-written body left empty), or hold the agent's words for a person (a defect such as stray formatting)."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"description":"Today's free agent-written previews are spent."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"The mailbox could not send."},"503":{"description":"The agent has not written this contact's message yet."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Send this step as a real test email","tags":["sequences"]}},"/sequences/{sequence_id}/sync/":{"post":{"description":"Run the audience diff now and report what changed.\n\nEnrolment is event-driven: a table announces rows arriving, finishing or being deleted, and live audiences react to it. Nothing polls, and the dashboard offers no button for this. It survives as the recovery path (an audience bound while the sequence was paused, or one that missed an announcement) and for callers driving a sequence over the API.","operationId":"sync_sequence","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}},{"in":"query","name":"expected_table_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Expected Table Id"}},{"in":"query","name":"continuous_only","required":false,"schema":{"default":false,"title":"Continuous Only","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncSequenceResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Sync a sequence's enrolments now","tags":["sequences"]}},"/sequences/{sequence_id}/viewed/":{"post":{"description":"Note that the CALLING USER just opened this sequence, which is what feeds their Recent on the Sequences list. Best-effort: clients fire it on open and ignore the result. Never touches the star: opening a sequence says nothing about whether the person wants it starred.","operationId":"record_sequence_view","parameters":[{"in":"path","name":"sequence_id","required":true,"schema":{"format":"uuid","title":"Sequence Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceUserPrefsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Record that the caller opened this sequence","tags":["sequences"]}},"/table-column-color-labels/":{"get":{"description":"Get what this organisation calls each column tint. Sparse: a colour that has not been renamed is absent, and the client shows its built-in name.","operationId":"get_color_labels","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnColorLabelsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get column colour names","tags":["table-column-color-labels"]},"patch":{"description":"Replace the organisation's column colour names. Send the whole set: a colour omitted, or given a blank name, reverts to its built-in name.","operationId":"update_color_labels","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnColorLabelsUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnColorLabelsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rename column colours","tags":["table-column-color-labels"]}},"/table-enrichments/actions/":{"get":{"description":"The server-owned catalog of enrichment actions the picker renders. Sorted by category then display name; development-only actions are absent in production.","operationId":"list_enrichment_actions","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichmentActionCatalogResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List enrichment actions","tags":["table-enrichments"]}},"/table-enrichments/builtin-agent-templates/":{"get":{"description":"The built-in agents as copyable starting points, prompt and model included, so the agents page can seed a saved-agent editor from one. Every agent the picker offers this org, filtered by the same per-org visibility; `is_template` marks the curated few.","operationId":"list_builtin_agent_templates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuiltinAgentTemplateListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List built-in agent templates","tags":["table-enrichments"]}},"/table-enrichments/generate/":{"post":{"description":"Turn one plain-language sentence into a draft AI-column configuration: display name, prompt with column references, output fields and a model suggestion. The draft seeds the editor and is not saved.","operationId":"generate_enrichment_column","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateEnrichmentColumnRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichmentColumnDraftSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Generate an enrichment column draft","tags":["table-enrichments"]}},"/table-enrichments/mcp-servers/":{"get":{"description":"The organisation's MCP servers, alphabetical.","operationId":"list_mcp_servers","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List MCP servers","tags":["table-enrichments"]},"post":{"description":"Register a tool server agents can attach.","operationId":"create_mcp_server","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"description":"Server name already taken"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create an MCP server","tags":["table-enrichments"]}},"/table-enrichments/mcp-servers/catalog/":{"get":{"description":"The curated hosted MCP servers, merged with this organisation's connection state per tile.","operationId":"list_mcp_catalog","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCatalogListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the MCP connect catalog","tags":["table-enrichments"]}},"/table-enrichments/mcp-servers/oauth/callback/":{"post":{"description":"Exchange the provider redirect's code for the grant, persist the connection, and return the server with a live probe of its tools.","operationId":"finish_mcp_oauth_connect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpOauthCallbackRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpOauthCallbackResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Unknown catalog entry"},"422":{"description":"The sign-in attempt expired or was rejected"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"The authorization service is unreachable"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Finish an MCP OAuth connection","tags":["table-enrichments"]}},"/table-enrichments/mcp-servers/oauth/connect/":{"post":{"description":"Begin (or redo) the OAuth flow for one catalog entry and return the authorization URL to send the browser to. Reconnecting uses the same call.","operationId":"start_mcp_oauth_connect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpOauthConnectRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpOauthConnectResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Unknown catalog entry"},"422":{"description":"The entry cannot be connected"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"description":"The server or its authorization service is unreachable"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Start an MCP OAuth connection","tags":["table-enrichments"]}},"/table-enrichments/mcp-servers/{mcp_server_id}/":{"delete":{"description":"Delete an MCP server; it detaches from every agent that had it.","operationId":"delete_mcp_server","parameters":[{"in":"path","name":"mcp_server_id","required":true,"schema":{"format":"uuid","title":"Mcp Server Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"MCP server not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete an MCP server","tags":["table-enrichments"]},"patch":{"description":"Partially update an MCP server. `headers`, when present, replaces the whole header dict. Agents pick the change up on their next run.","operationId":"update_mcp_server","parameters":[{"in":"path","name":"mcp_server_id","required":true,"schema":{"format":"uuid","title":"Mcp Server Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"MCP server not found"},"422":{"description":"Server name already taken"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update an MCP server","tags":["table-enrichments"]}},"/table-enrichments/mcp-servers/{mcp_server_id}/verify/":{"post":{"description":"Probe the server live with its stored configuration and return the tools it offers. An unreachable server is a 200 with ok=false, because the probe's outcome is the payload, not an API failure.","operationId":"verify_mcp_server","parameters":[{"in":"path","name":"mcp_server_id","required":true,"schema":{"format":"uuid","title":"Mcp Server Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerVerifyResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"MCP server not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Verify an MCP server","tags":["table-enrichments"]}},"/table-enrichments/models/":{"get":{"description":"The user-facing model catalog: named tiers with per-row credit costs, cheapest first. The default is marked.","operationId":"list_enrichment_models","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichmentModelCatalogResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List enrichment models","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/":{"get":{"description":"The organisation's saved agent personas, alphabetical. Each one says whether the person asking starred it and when they last opened it: both are that person's own. `favorites` keeps only the agents they starred; `recent` keeps only the ones they opened, the latest open first, at most 20. An API key has no person, so both read empty for it. `search` keeps the agents whose name, description or prompt holds the text, ignoring case.","operationId":"list_saved_agents","parameters":[{"in":"query","name":"is_template","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Template"}},{"in":"query","name":"favorites","required":false,"schema":{"default":false,"title":"Favorites","type":"boolean"}},{"in":"query","name":"recent","required":false,"schema":{"default":false,"title":"Recent","type":"boolean"}},{"description":"Case-insensitive text the agent's name, description or prompt holds; the prompt reads each input by its name.","in":"query","name":"search","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Case-insensitive text the agent's name, description or prompt holds; the prompt reads each input by its name.","title":"Search"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List saved agents","tags":["table-enrichments"]},"post":{"description":"Create an org-level reusable agent: declared inputs, a prompt referencing them, output shape, model and tools. Agent columns can point at it.","operationId":"create_saved_agent","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a saved agent","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/generate/stream/":{"post":{"description":"Expand a natural-language task into a complete agent draft (a structured prompt with {{input}} placeholders, a name and icon, typed output fields and sample test cases), streamed as Server-Sent Events. The first frame is `turn`, carrying the `generation_id` a Stop is sent to; then a `step` frame for each thing the builder actually did (`read_context` when the workspace has written its business context, `write_instructions`, `choose_outputs`, `write_examples`, `finish`), each with its measured duration; then one `result` frame with the draft.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `limit` or `paused` when the workspace's daily AI Assistant allowance refused the build, `stopped` when the caller stopped it, and no reason for anything else. Counts against the allowance; a stopped or failed build gives its turn back.\n\nClosing the connection does not stop the build; the Stop route does.","operationId":"stream_generate_saved_agent","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentGenerateRequestSchema"}}},"required":true},"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SavedAgentGeneratedDraftSchema","type":"string"}}},"description":"A stream of Server-Sent Events; the final `result` frame's `data` is the generated draft."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Generate an agent draft from a task, streaming its work","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/generate/{generation_id}/stop/":{"post":{"description":"Ask the build streaming under `generation_id` (its first frame) to stop. Cooperative: the build reads the request once a second while the model writes and again before each model call, and ends there, its trail on the last step and its stream in an `error` frame with reason `stopped`. A build that has already finished is unaffected. The turn a stopped build claimed is given back.","operationId":"stop_saved_agent_generation","parameters":[{"in":"path","name":"generation_id","required":true,"schema":{"format":"uuid","title":"Generation Id","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentGenerationStopResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Stop an agent draft that is being generated","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/inputs/generate/":{"post":{"description":"Read a prompt, work out which values have to change from row to row, declare them, and return the prompt with each literal mention replaced by a reference to what was declared. Inputs the agent already declares keep their ids and are never dropped. Nothing is stored. The caller drops the result into the editor and decides what to keep. Counts against the workspace's daily AI Assistant allowance; a refused call answers 429.","operationId":"generate_saved_agent_inputs","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentInputGenerateRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentInputGenerateResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantUnavailableResponseSchema"}}},"description":"The workspace's AI Assistant allowance is spent, or the AI Assistant is paused"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Declare the per-row inputs a prompt needs","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/outputs/generate/":{"post":{"description":"Read a prompt and propose the typed fields the agent should return. Nothing is stored. The caller drops the result into the editor and decides what to keep. Counts against the workspace's daily AI Assistant allowance; a refused call answers 429.","operationId":"generate_saved_agent_outputs","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentOutputGenerateRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentOutputGenerateResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantUnavailableResponseSchema"}}},"description":"The workspace's AI Assistant allowance is spent, or the AI Assistant is paused"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Derive an output schema from a prompt","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/prompt/edit/":{"post":{"description":"Take the prompt as it stands in the editor plus a change the user described in their own words, and return the full revised prompt with a one-sentence summary of what changed. The prompt is not stored. The caller decides whether to keep the revision. Counts against the workspace's daily AI Assistant allowance; a refused call answers 429.","operationId":"edit_saved_agent_prompt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentPromptEditRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentPromptEditResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantUnavailableResponseSchema"}}},"description":"The workspace's AI Assistant allowance is spent, or the AI Assistant is paused"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Revise an agent prompt from a natural-language change","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/prompt/edit/stream/":{"post":{"description":"The streaming form of the revision: the same full revised prompt and one-sentence summary, sent as Server-Sent Events. The first frame is `turn`, carrying the `edit_id` a Stop is sent to; then a `step` frame for each thing the assistant actually did (`read_feedback` when `saved_agent_id` names an agent whose complaints to read, `rewrite_prompt` for the model call, `finish` with the line counts), each with its measured duration; then one `result` frame with the revision as the plain route returns it.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `limit` or `paused` when the workspace's daily AI Assistant allowance refused the revision, `stopped` when the caller stopped it, and no reason for anything else. Counts against the allowance; a stopped or failed revision gives its turn back.\n\nClosing the connection does not stop the revision; the Stop route does. Requires a signed-in person; the plain route serves API keys.","operationId":"stream_edit_saved_agent_prompt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentPromptEditRequestSchema"}}},"required":true},"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SavedAgentPromptEditResponseSchema","type":"string"}}},"description":"A stream of Server-Sent Events; the final `result` frame's `data` is the revised prompt."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Revise an agent prompt from a natural-language change, streaming the work","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/prompt/edit/{edit_id}/stop/":{"post":{"description":"Ask the revision streaming under `edit_id` (its first frame) to stop. Cooperative: the revision reads the request once a second while the model writes and again before the prompt is handed back, and ends there, its trail on the last step with `Stopped by you` on the one it interrupted and its stream in an `error` frame with reason `stopped`. A revision that has already landed is unaffected. The turn a stopped revision claimed is given back.","operationId":"stop_saved_agent_prompt_edit","parameters":[{"in":"path","name":"edit_id","required":true,"schema":{"format":"uuid","title":"Edit Id","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentPromptEditStopResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Stop an agent prompt revision that is being streamed","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/{saved_agent_id}/":{"delete":{"description":"Delete a saved agent. Columns pointing at it keep their reference and fail visibly on their next run.","operationId":"delete_saved_agent","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a saved agent","tags":["table-enrichments"]},"get":{"description":"Get one saved agent by ID.","operationId":"get_saved_agent","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a saved agent","tags":["table-enrichments"]},"patch":{"description":"Partially update a saved agent. Columns pointing at it pick the change up on their next run. `favorite` stars or unstars it for the person asking alone, and is refused from an API key.","operationId":"update_saved_agent","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a saved agent","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/{saved_agent_id}/feedback/":{"get":{"description":"Every verdict left on a value this agent produced, across all tables, newest first: the complaints that say what to fix, and the tally that says how often it is right.","operationId":"get_saved_agent_feedback","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentFeedbackResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"What people thought of an agent's output","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/{saved_agent_id}/mcp-servers/":{"get":{"description":"The MCP servers attached to this saved agent, alphabetical.","operationId":"list_agent_mcp_servers","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List an agent's attached MCP servers","tags":["table-enrichments"]},"put":{"description":"Replace the saved agent's attached MCP servers with exactly the given set. Every server must belong to the organisation.","operationId":"set_agent_mcp_servers","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMcpServersSetSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent or an MCP server not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Set an agent's attached MCP servers","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/{saved_agent_id}/usage/":{"get":{"description":"The table columns deployed from this saved agent, across all tables. This is what a central edit to the agent will touch.","operationId":"get_saved_agent_usage","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentUsageResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Where a saved agent is used","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/{saved_agent_id}/versions/":{"get":{"description":"The agent's version history, newest first. Every configuration save appends a version; a person's star never versions.","operationId":"list_saved_agent_versions","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentVersionListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List a saved agent's versions","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/{saved_agent_id}/versions/{version}/revert/":{"post":{"description":"Apply a prior version's configuration as a new save. The revert itself becomes the next version, keeping history linear.","operationId":"revert_saved_agent","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}},{"in":"path","name":"version","required":true,"schema":{"title":"Version","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent or version not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Revert a saved agent to a version","tags":["table-enrichments"]}},"/table-enrichments/saved-agents/{saved_agent_id}/viewed/":{"post":{"description":"Note that the CALLING USER just opened this agent, which is what feeds their Recent on the Agents list. Best-effort: clients fire it on open and ignore the result. Never touches the star: opening an agent says nothing about whether the person wants it starred.","operationId":"record_saved_agent_view","parameters":[{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedAgentUserPrefsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Saved agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Record that the caller opened this agent","tags":["table-enrichments"]}},"/table-imports/preview/":{"post":{"description":"Upload a `.csv` or `.xlsx` file. The response carries one suggested column per field (a name taken from the header row and a type every sampled value fits) plus a few raw rows so the user can judge those guesses.\n\nNOTHING is created here: no table, no columns, no rows. Review the mapping, edit it, and POST it to the commit endpoint to build the table.\n\nThe format is decided by the file's own first bytes, not by its name or its declared content type, both of which are client-supplied. A workbook is read one sheet at a time: `sheet_names` lists the rest and the sheet endpoint re-reads the same upload from another one.\n\nRejects a file that is too large or too wide, so an import that cannot succeed fails before it costs a table name. A file with more rows than the plan allows is NOT rejected: `importable_row_count` comes back below `estimated_row_count` and the import takes the file's first rows.","operationId":"preview_table_import_csv","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_table_import_csv"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableImportPreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Upload a CSV or Excel file and preview the table it would create","tags":["table-imports"]}},"/table-imports/{import_id}/":{"get":{"description":"Poll an import's progress. `imported_rows` climbs against `total_rows` while the load runs; `status` reaches `succeeded` or `failed` and stays there.\n\n`failed_rows` is the exact count of rows that could not be written, while `row_errors` carries only a capped sample of them for display.","operationId":"get_table_import_csv","parameters":[{"in":"path","name":"import_id","required":true,"schema":{"format":"uuid","title":"Import Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableImportJobResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Import not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a CSV import's status","tags":["table-imports"]}},"/table-imports/{import_id}/columns/{source_index}/values/":{"get":{"description":"Read exact value counts, percentages, empty and distinct counts across all data rows of an uploaded CSV or the selected XLSX sheet, before row caps. Includes the top 20 values and an explicit other_count, plus a page of raw values in file order. source_index is zero-based. Whitespace-only values are empty; other values retain their raw spelling. Blank data rows are skipped as in the import.","operationId":"read_table_import_column_values","parameters":[{"in":"path","name":"import_id","required":true,"schema":{"format":"uuid","title":"Import Id","type":"string"}},{"in":"path","name":"source_index","required":true,"schema":{"title":"Source Index","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"title":"Offset","type":"integer"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportColumnValuesDTO"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Column or source not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read an import column's value distribution and raw values","tags":["table-imports","mcp-searchable-tool"]}},"/table-imports/{import_id}/commit/":{"post":{"description":"Create the table and its columns from the reviewed mapping, then start the row load in the background.\n\nThe table exists as soon as this returns, so the client can navigate to it immediately and watch rows arrive. Poll the job to follow progress.\n\nCommitting twice is refused: the second call finds the import already running rather than creating a second table.","operationId":"commit_table_import_csv","parameters":[{"in":"path","name":"import_id","required":true,"schema":{"format":"uuid","title":"Import Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableImportCommitRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableImportJobResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Plan table limit reached. Upgrade to create more tables."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Import or folder not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create the table and start loading its rows","tags":["table-imports"]}},"/table-imports/{import_id}/sheet/":{"post":{"description":"Read the workbook that was already uploaded from another of its sheets, and return a fresh preview. The upload is not sent again: the file is already stored, and it can be large.\n\nEvery column is inferred from scratch, so the mapping in the response REPLACES the one being edited rather than merging into it. Two sheets share nothing but a file.\n\nOnly a pending import can change sheet; once committed, the table exists and its columns are fixed.","operationId":"select_table_import_sheet","parameters":[{"in":"path","name":"import_id","required":true,"schema":{"format":"uuid","title":"Import Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableImportSheetRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableImportPreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Import not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Re-read a pending upload from a different sheet","tags":["table-imports"]}},"/table-integration-lookup/connections/":{"get":{"description":"Every connected integration whose SDK can fetch single records, with the record types it can fetch: the Tools panel's 'Your data' section.\n\nThe connection and record-type list costs no network calls (capabilities are read off the SDK class), so a connection with expired credentials still appears, carrying its recorded health. Identity fields DO need the live connection; they are probed best-effort under a short per-connection budget and come back null where the probe failed. The identity-fields endpoint answers live for those.","operationId":"list_lookup_connections","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LookupConnectionSchema"},"title":"Response List Lookup Connections","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List connections a lookup column could read","tags":["table-integration-lookup"]}},"/table-integration-lookup/identity-fields/":{"get":{"description":"Asks the LIVE connection which identity fields its lookups accept for one record type: the editor's select, fetched once a connection and record type are chosen. Expired credentials fail here with a message about the connection rather than at run time.","operationId":"get_lookup_identity_fields","parameters":[{"in":"query","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}},{"in":"query","name":"record_type","required":true,"schema":{"title":"Record Type","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LookupIdentityFieldsSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the fields one record type can be looked up by","tags":["table-integration-lookup"]}},"/table-sources/":{"post":{"description":"Create the table, its imported-record column and a few extracted columns, then start loading rows in the background.\n\nThe table exists as soon as this returns, so the client can navigate to it immediately and watch rows arrive. Poll the run to follow progress.\n\nEvery record lands whole in one Object column. The extracted columns are formulas reading paths out of it, so a refresh updates them for free, and any field the import brought back can be given its own column later without re-fetching anything.\n\n`identity_field` picks which of the preview's `identity_field_choices` rows are matched on across refreshes; left out, the preview's recommended one is used. A key some records lack or records share is refused with a 422.","operationId":"create_table_from_source","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTableFromSourceRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTableFromSourceResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration or folder not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a table fed by an integration","tags":["table-sources"]}},"/table-sources/integrations/":{"get":{"description":"Every connected integration whose SDK can list records, with the object types it offers.\n\nCosts no network calls: the capability is read off the SDK class, not a live connection, so an integration with expired credentials still appears here and fails later with a message about its credentials.","operationId":"list_importable_integrations","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ImportableIntegrationSchema"},"title":"Response List Importable Integrations","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List integrations a table could import from","tags":["table-sources"]}},"/table-sources/preview/":{"post":{"description":"Fetch a page of records and report what is in them: the fields they carry, example values, and which identifier rows would be matched on across refreshes.\n\nNOTHING is created here. Review it, then POST to the create endpoint.\n\n`fields` merges what the sampled records actually contained with what the provider says a record of this type can carry, so a field every sampled record happens to leave empty is still offered.","operationId":"preview_table_import_integration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSourcePreviewRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSourcePreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Sample records before importing them","tags":["table-sources"]}},"/table-sources/runs/{run_id}/":{"get":{"description":"Poll an import's progress. `rows_created` and `rows_updated` climb while it runs; `status` reaches `succeeded` or `failed` and stays there.\n\n`rows_skipped` counts records the run read and left out, split by why: `rows_skipped_no_identity` came back with no value for the field rows are matched on, `rows_skipped_duplicate` shared their match value with an earlier record in the same page. The skipped-records route names them. `stopped_at_row_limit` says the run stopped at the source's row limit with records still unread in the tool, which is not a skip.","operationId":"get_table_import_integration_run","parameters":[{"in":"path","name":"run_id","required":true,"schema":{"format":"uuid","title":"Run Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSourceRunSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Run not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get an import run's status","tags":["table-sources"]}},"/table-sources/runs/{run_id}/skips/":{"get":{"description":"Which records a connected-tool import read and left out of the table, and why: no value for the field rows are matched on, or a match value an earlier record in the same page already had. Each names the record the way to find it in the tool (its name or email, else another of its ids). Records past the row limit are not here: the run never read them, and says so in `stopped_at_row_limit`.","operationId":"list_table_import_integration_run_skips","parameters":[{"in":"path","name":"run_id","required":true,"schema":{"format":"uuid","title":"Run Id","type":"string"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAt","default":"id","enum":["id","created_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"asc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TableSourceRunSkipSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Run not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the records an import run skipped","tags":["table-sources"]}},"/table-templates/":{"get":{"description":"The organisation's saved multi-column templates, newest first.","operationId":"list_column_templates","parameters":[{"description":"Case-insensitive name fragment.","in":"query","name":"name__contains","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Case-insensitive name fragment.","title":"Name  Contains"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColumnTemplateListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List column templates","tags":["table-templates"]},"post":{"description":"Snapshot a selection of a table's columns (definitions, settings and the display names their references carry) as a named, org-level template replayable on any table.","operationId":"create_column_template","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColumnTemplateCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColumnTemplateReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or column not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Capture a multi-column template","tags":["table-templates"]}},"/table-templates/{template_id}/":{"delete":{"description":"Delete a saved template. Columns already created from it are untouched: a template is a snapshot of how to build them, not a link to them.","operationId":"delete_column_template","parameters":[{"in":"path","name":"template_id","required":true,"schema":{"format":"uuid","title":"Template Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Template not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a column template","tags":["table-templates"]}},"/table-templates/{template_id}/apply/":{"post":{"description":"Create the template's columns on a table, left to right, as one block at the requested position (appended when omitted), references remapped: template-internal references land on their new counterparts, external ones on the target's same-named columns, and anything unmatched stays visibly broken rather than silently wrong. All or nothing: a column the table refuses undoes the ones created before it. Nothing runs. The created columns wait to be run deliberately.","operationId":"apply_column_template","parameters":[{"in":"path","name":"template_id","required":true,"schema":{"format":"uuid","title":"Template Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColumnTemplateApplySchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColumnTemplateApplyResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Template or table not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Apply a template to a table","tags":["table-templates"]}},"/table-writeback/columns/{column_id}/push-summary/":{"get":{"description":"Counts from the export ledger (one entry per cell) answering the verification question directly: how many of this table's rows were created at the destination versus updated there, and when the newest push happened. Empty for a column that has never pushed.","operationId":"get_push_summary","parameters":[{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSummarySchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Summarise what an export column has pushed","tags":["table-writeback"]}},"/table-writeback/integrations/":{"get":{"description":"Every connected integration whose SDK can write records, with the object types it can write and the actions (create, update, upsert) each type supports.\n\nCosts no network calls: capabilities are read off the SDK class, not a live connection, so an integration with expired credentials still appears here (carrying its recorded health) and fails later with a message about its credentials.","operationId":"list_writable_integrations","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WritableIntegrationSchema"},"title":"Response List Writable Integrations","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List destinations a table could export to","tags":["table-writeback"]}},"/table-writeback/preview/":{"post":{"description":"Render each row's outgoing payload exactly as a real run would, ask the destination (READ-ONLY) whether the row matches an existing record, and report what a real run would do: create, update or skip.\n\nNOTHING is written. The write half of the executor is unreachable from this path.","operationId":"preview_export","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportPreviewRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportPreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Dry-run an export against real rows","tags":["table-writeback"]}},"/table-writeback/write-capabilities/":{"get":{"description":"The legal write actions (including composite create-or-update), the fields records can be matched on, the supported write modes, and whether matching is possible at all: everything the export editor's action, match-key and write-mode controls are driven by.\n\nProbes the LIVE connection, so expired credentials fail here with a message about the connection rather than at run time.","operationId":"get_write_capabilities","parameters":[{"in":"query","name":"integration_id","required":true,"schema":{"format":"uuid","title":"Integration Id","type":"string"}},{"in":"query","name":"record_type","required":true,"schema":{"title":"Record Type","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteCapabilitiesSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Integration not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Derive what one destination record type can do","tags":["table-writeback"]}},"/tables/":{"get":{"description":"List the organisation's tables with cursor pagination and optional filters. Every folder is reached unless folder_id or top_level narrows it, and archived tables are left out unless archived says otherwise. Each table says the folders on the way to it.","operationId":"list_tables","parameters":[{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListTablesFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtNameOwnerUserId","default":"created_at","enum":["id","created_at","updated_at","name","owner_user_id"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TableReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List tables","tags":["tables","mcp-always-include"]},"post":{"description":"Create a table with its starter canvas: one manual text column (New column) and a screenful of empty rows. One request transaction, atomic; the default column is manual, so no recompute run is requested. Leave the name out to get the next free name: \"New table\", then \"New table (2)\" and onward. The person creating it owns it, and folder_id makes it inside that folder.","operationId":"create_table","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Plan table limit reached. Upgrade to create more tables."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Folder not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a table","tags":["tables","mcp-always-include"]}},"/tables/archive/":{"post":{"description":"archived true takes these tables off the list: out of All, their folder, Favorites and Recent, while search still finds them, they open as before and keep every row. archived false brings them back, into their folder. Nothing archives a table by itself; only this does.","operationId":"archive_tables","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableArchiveSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TablesChangedSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Archive tables, or bring them back","tags":["tables"]}},"/tables/columns/function-catalog/":{"get":{"description":"Get the static catalog of every formula function: name, display label, and UI grouping category. Code-defined and identical for every organisation.","operationId":"get_function_catalog","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionCatalogResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the function catalog","tags":["table-columns"]}},"/tables/favorites/":{"get":{"description":"List the tables the CALLING USER has starred, newest-starred first. Per-user: a teammate's favourites are a different list.\n\nNon-paginated by design: a favourites list that needs paging has stopped being a shortcut.","operationId":"list_favorite_tables","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the caller's starred tables","tags":["tables"]}},"/tables/folders/":{"get":{"description":"Every live folder in the workspace, at every level, by name. parent_id says where each one sits. Each says how many tables and folders it holds, and when the caller last opened a table in it.","operationId":"list_table_folders","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableFolderListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List folders","tags":["tables"]},"post":{"description":"Make a folder, at the top level or inside parent_id. Leave the name out for \"Untitled folder\". Names are unique among a folder's live siblings, case aside. Whoever makes it owns it.","operationId":"create_table_folder","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableFolderCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableFolderSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Parent folder not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Make a folder","tags":["tables"]}},"/tables/folders/trash/":{"get":{"description":"The folders somebody moved to Trash, newest first, each with how many tables went with it. A folder that went with its own parent is not listed.","operationId":"list_trashed_table_folders","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashedTableFolderListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List folders in Trash","tags":["tables"]}},"/tables/folders/{folder_id}/":{"delete":{"description":"Move a folder to Trash with every folder and table in it, archived tables included, as Google Drive does. Trash lists the folder, and restoring it brings everything back together. Trash keeps it for the same 30 days as a table.","operationId":"delete_table_folder","parameters":[{"in":"path","name":"folder_id","required":true,"schema":{"format":"uuid","title":"Folder Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableFolderTrashResultSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Folder not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Move a folder to Trash","tags":["tables"]},"patch":{"description":"Rename a folder, move it into another folder (parent_id, null for the top level) with everything in it, or change who owns it. A folder cannot move inside itself or one of its own folders.","operationId":"update_table_folder","parameters":[{"in":"path","name":"folder_id","required":true,"schema":{"format":"uuid","title":"Folder Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableFolderUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableFolderSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Folder not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rename, move or re-own a folder","tags":["tables"]}},"/tables/folders/{folder_id}/purge/":{"delete":{"description":"Permanently destroy a folder that is in Trash, with every folder and table that went there with it, and every row those tables held. This cannot be undone.","operationId":"purge_table_folder","parameters":[{"in":"path","name":"folder_id","required":true,"schema":{"format":"uuid","title":"Folder Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Folder not found in Trash"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Destroy a folder in Trash for good","tags":["tables"]}},"/tables/folders/{folder_id}/restore/":{"post":{"description":"Bring a folder back with every folder and table that went to Trash with it, where it was (the top level when its own folder is gone). A table whose name a live table has taken since stays in Trash, listed there on its own, and the answer names it.","operationId":"restore_table_folder","parameters":[{"in":"path","name":"folder_id","required":true,"schema":{"format":"uuid","title":"Folder Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableFolderTrashResultSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Folder not found in Trash"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Restore a folder from Trash","tags":["tables"]}},"/tables/length/":{"get":{"description":"Get the number of the organisation's tables under the same optional filters.","operationId":"get_tables_count","parameters":[{"description":"Filter by name (case-insensitive contains).","in":"query","name":"name__contains","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Filter by name (case-insensitive contains).","title":"Name  Contains"}},{"description":"Filter by created_at after this instant (ISO 8601).","in":"query","name":"created_at__after","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Filter by created_at after this instant (ISO 8601).","title":"Created At  After"}},{"description":"Filter by created_at before this instant (ISO 8601).","in":"query","name":"created_at__before","required":false,"schema":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"Filter by created_at before this instant (ISO 8601).","title":"Created At  Before"}},{"description":"Filter to tables this workspace member owns.","in":"query","name":"owner_user_id","required":false,"schema":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"description":"Filter to tables this workspace member owns.","title":"Owner User Id"}},{"description":"Only tables that nobody owns.","in":"query","name":"unowned","required":false,"schema":{"default":false,"description":"Only tables that nobody owns.","title":"Unowned","type":"boolean"}},{"description":"Only the tables directly in this folder. Leave it and top_level out to reach every folder, as search does.","in":"query","name":"folder_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Only the tables directly in this folder. Leave it and top_level out to reach every folder, as search does.","title":"Folder Id"}},{"description":"Only the tables in no folder: the top level of the Tables list.","in":"query","name":"top_level","required":false,"schema":{"default":false,"description":"Only the tables in no folder: the top level of the Tables list.","title":"Top Level","type":"boolean"}},{"description":"exclude (the default) leaves archived tables out, as the list does; include lists them beside the rest, as search does; only lists them alone, as the Archived view does.","in":"query","name":"archived","required":false,"schema":{"$ref":"#/components/schemas/ArchivedScope","default":"exclude","description":"exclude (the default) leaves archived tables out, as the list does; include lists them beside the rest, as search does; only lists them alone, as the Archived view does."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCountSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get the number of tables","tags":["tables"]}},"/tables/move/":{"post":{"description":"Put these tables in a folder, or at the top level of the Tables list with a null folder_id. Archived tables move too, and go back to that folder when restored. A table still waiting to be filed after folders replaced tags counts as filed.","operationId":"move_tables","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableMoveSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TablesChangedSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Folder not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Move tables into a folder","tags":["tables"]}},"/tables/owner-choices/":{"get":{"description":"Every member of the workspace, by name with their email address: who a table or a folder can be given to with the owner change.","operationId":"list_table_owner_choices","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableOwnerChoiceListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List who a table can be given to","tags":["tables"]}},"/tables/owner/":{"post":{"description":"Name the workspace member who owns these tables, or nobody. Owner means who to ask about a table: it grants and takes away no access, so anyone in the workspace may change it.","operationId":"set_tables_owner","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableOwnerChangeSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TablesChangedSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"That person is not in this workspace."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Change who owns tables","tags":["tables"]}},"/tables/owners/":{"get":{"description":"Every workspace member who owns a table on the list, with how many, most first, and how many tables nobody owns. What the list's owner filter offers.","operationId":"list_table_owners","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableOwnerListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List who owns tables","tags":["tables"]}},"/tables/recents/":{"get":{"description":"List the tables the CALLING USER opened most recently, newest first. Fed by the viewed endpoint, capped at a short length, because 'recent' stops meaning anything once it holds everything.","operationId":"list_recent_tables","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the caller's recently opened tables","tags":["tables"]}},"/tables/trash/":{"get":{"description":"List the organisation's trashed tables, newest deletion first. Each one can be restored in full, or destroyed early with the purge endpoint; otherwise the retention sweep destroys it once it is old enough. A table that went to Trash with its folder is not listed: the folder is, under the trashed folders listing, and it comes back with its folder. `name__contains` narrows it by name, as the Trash page's search does.","operationId":"list_trashed_tables","parameters":[{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListTrashedTablesFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtName","default":"updated_at","enum":["id","created_at","updated_at","name"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TableReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List trashed tables","tags":["tables"]}},"/tables/trash/length/":{"get":{"description":"Count the tables the trashed tables listing holds, under the same optional filters: a table that went to Trash with its folder is not counted.","operationId":"count_trashed_tables","parameters":[{"description":"Filter by name (case-insensitive contains).","in":"query","name":"name__contains","required":false,"schema":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"description":"Filter by name (case-insensitive contains).","title":"Name  Contains"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCountSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count trashed tables","tags":["tables"]}},"/tables/unfiled/":{"get":{"description":"Tables that carried more than one tag when folders replaced tags, so could not be filed by themselves. Each says its former tags; moving it anywhere, the top level included, files it.","operationId":"list_unfiled_tables","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List tables waiting to be filed","tags":["tables"]}},"/tables/untouched/":{"get":{"description":"Tables on the list that nobody in the workspace has opened or changed for the window this answer names (60 days), longest untouched first: what the list suggests archiving. A suggestion only; nothing here archives anything.","operationId":"list_untouched_tables","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UntouchedTablesSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List tables nobody has touched for a while","tags":["tables"]}},"/tables/{table_id}/":{"delete":{"description":"Move a table to Trash. Nothing is destroyed: its columns, rows and cells all stay, the table simply stops appearing anywhere except the Trash listing, and it can be restored in full.\n\nThe table's name is freed immediately, so the same name can be reused at once. A retention sweep destroys trashed tables for good once they are old enough.","operationId":"delete_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Move a table to Trash","tags":["tables"]},"get":{"description":"Get details of a specific table.","operationId":"get_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get table details","tags":["tables","mcp-always-include"]},"patch":{"description":"Partially update a table's name or description (omitted fields are left untouched). Cosmetic only: no recompute run is requested.","operationId":"update_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a table","tags":["tables","mcp-searchable-tool"]}},"/tables/{table_id}/cells/":{"post":{"description":"Edit one manual cell (read-your-writes: the response carries the post-write row state and version). When the edit marks formula dependents stale, a small scope is recomputed INLINE inside this request: those columns are listed in `recomputed_column_ids` and their final values are already in `cells`, with no run requested. A larger scope instead requests a cell-edited recompute run that appears on the next active-runs poll; the response never carries a run ID. A same-value edit writes nothing, recomputes nothing, and requests no run.\n\nA Select or Multi-select cell takes only the column's own options (its `type_options.choices`): a value is matched to one ignoring case and spacing and stored as the option is spelled, and anything else is refused with a 422 `cell_value_not_a_choice` that lists the options.","operationId":"set_table_cell","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCellEditRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCellMutationResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Row or column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Set a table cell value","tags":["table-rows"]}},"/tables/{table_id}/cells/bulk/":{"post":{"description":"Apply up to 1000 manual cell edits in ONE transaction, then recompute their downstream formula cells: inline when the scope is small (see `recomputed_column_ids`), otherwise via a SINGLE cell-edited run covering all of them. The endpoint that makes a grid paste one request instead of N. A null value clears that cell. All-or-nothing: every column and value is validated before anything is written, so a formula column or a type mismatch anywhere rejects the whole batch and writes nothing. Same-value edits are counted in skipped and write nothing. Read-your-writes: the response carries every named row's post-write state and version.\n\nA Select or Multi-select cell takes only the column's own options (its `type_options.choices`): each value is matched to one ignoring case and spacing and stored as the option is spelled, and one that names no option refuses the whole batch with a 422 `cell_value_not_a_choice` naming the cell and the options. `restore` is for the grid's undo and redo history ONLY: it writes back a value the options no longer name exactly as the cell held it. Never set it to get a new value past the options; add the value to the column's options instead.","operationId":"bulk_set_table_cells","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCellsBulkEditRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCellsBulkMutationResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Row or column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Set many table cell values","tags":["table-rows"]}},"/tables/{table_id}/cells/clear/":{"post":{"description":"Clear one manual cell so the column's default value renders again (read-your-writes, same contract as the cell edit). When the clear marks formula dependents stale, a small scope is recomputed inline (see `recomputed_column_ids`) and a larger one requests a cell-edited recompute run. Clearing an already blank cell writes nothing and requests no run.","operationId":"clear_table_cell","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCellClearRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableCellMutationResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Row or column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Clear a table cell value","tags":["table-rows"]}},"/tables/{table_id}/cells/feedback/bulk/":{"post":{"description":"Apply ONE verdict, and one optional note, to up to 1000 cells. The endpoint that makes rating a swept selection a single request instead of N. The rating and the note are shared because a sweep is one judgement about one thing the column got wrong. Lenient per cell: a selection spanning a column that runs no saved agent rates the rest and counts the others in `skipped`, since a rectangular selection routinely crosses column kinds. Re-rating replaces the earlier verdict rather than adding a second one.","operationId":"bulk_rate_cells","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CellFeedbackBulkRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CellFeedbackBulkResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rate many cells at once","tags":["table-rows"]}},"/tables/{table_id}/columns/":{"get":{"description":"List all columns of a table in position order (non-paginated by design). Each column's hidden, pinned and width are the caller's own laid over the team's; its colour is the team's.","operationId":"list_table_columns","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List table columns","tags":["table-columns","mcp-always-include"]},"post":{"description":"Create a column. A formula column requests a column-added recompute run over all rows. The run appears on the next active-runs poll; the response never carries a run ID. Manual columns request nothing.","operationId":"create_table_column","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a table column","tags":["table-columns","mcp-searchable-tool"]}},"/tables/{table_id}/columns/add-agent/":{"post":{"description":"Deploy a saved agent onto the table as a linked enrichment column: a parent agent column plus a child column per selected output, each named after its FIELD and folded into one group labelled with the agent's name. Created unrun; pass `run_rows` to run that many first rows straight away. Bounded batches only: no run-all.","operationId":"add_agent_to_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddAgentToTableRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Add a saved agent to a table","tags":["table-columns"]}},"/tables/{table_id}/columns/agent-input-mappings/{saved_agent_id}/":{"get":{"description":"Suggest a table column for each of the agent's inputs by name similarity. This is the 'Suggest input mappings with AI' affordance.","operationId":"suggest_agent_input_mappings","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"saved_agent_id","required":true,"schema":{"format":"uuid","title":"Saved Agent Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentInputMappingSuggestionsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or agent not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest input→column mappings for an agent","tags":["table-columns"]}},"/tables/{table_id}/columns/batch-delete/":{"post":{"description":"Delete a set of columns as ONE delete: dependents inside the batch never block it, which is what lets a whole column group (a fan-out's children depend on their parent) go in one request. Dependents outside the batch still block, or are repointed via `replace_with_column_id`. A group whose last member is deleted is dissolved. A POST rather than a DELETE because it carries a body.","operationId":"batch_delete_table_columns","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnsBatchDeleteRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete several columns in one call","tags":["table-columns"]}},"/tables/{table_id}/columns/credit-rates/":{"get":{"description":"For every paid column on the table (hidden ones included), the most one row can cost and what one row usually costs, read from what the same kind of cell has been charged before. An AI column is charged what each row used under its per-row maximum, so the usual figure is often well under the maximum; with no history yet the two are equal. Reads only; nothing is priced live.","operationId":"list_table_column_credit_rates","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnCreditRatesResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get what each paid column costs per row","tags":["table-columns"]}},"/tables/{table_id}/columns/generate/":{"post":{"description":"Build a formula definition from a natural-language instruction. The generated chain is validated with the same reference and type derivation the save path uses, then returned UNSAVED for review. Feed it to the preview endpoint or the create endpoint unchanged. A rejected attempt is retried once with the validation error fed back. A few sample rows are sent to the model as context. When the request asks for data the table's columns do not hold, no formula is invented: the response is a 422 whose issue type is `formula_not_supported` and whose message explains what is missing.","operationId":"generate_table_column","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnGenerateRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnGenerateResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Generate a formula column from a description","tags":["table-columns"]}},"/tables/{table_id}/columns/groups/":{"post":{"description":"Create a column group over the given columns. They are pulled together at the leftmost member's position, keeping their current relative order, and the LAST member becomes the group's output: the column that stays visible when the group is collapsed. Groups are org-shared, like column order itself.","operationId":"create_table_column_group","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnGroupCreateRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnGroupReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Group columns","tags":["table-columns"]}},"/tables/{table_id}/columns/groups/{group_id}/":{"delete":{"description":"Dissolve a column group, leaving its columns exactly where they are. To delete the group WITH its columns, use the batch column delete with every member: the emptied group dissolves with them.","operationId":"delete_table_column_group","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"group_id","required":true,"schema":{"format":"uuid","title":"Group Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Column group not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Ungroup","tags":["table-columns"]},"patch":{"description":"Rename a group, fold or expand it, or replace its membership wholesale. `members` is FULL-state: the entry order becomes the members' physical order, newly listed columns join the group, and current members left out are removed and land immediately after the block. A group always has at least one member and at least one output: an empty list is refused (ungroup to dissolve a group), and so is a list with no output flagged (mark another column as output first). Collapse and `ui_color` are purely presentational. Folded members' cells stay fetched, and a group's colour is its own, independent of any tint its member columns carry.","operationId":"update_table_column_group","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"group_id","required":true,"schema":{"format":"uuid","title":"Group Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnGroupUpdateRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnGroupReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Column group not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a column group","tags":["table-columns"]}},"/tables/{table_id}/columns/preview/":{"post":{"description":"Evaluate an unsaved formula definition over the table's first 25 rows with the same data-type derivation the save path uses. Nothing is persisted and no run is requested. Every other kind of definition, including a Use AI or agent enrichment, is rejected with a 422 whose issue type is `column_kind_not_previewable`: to see what one of those fills in, create the column and run it on its first few rows.","operationId":"preview_table_column","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnPreviewRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnPreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Preview a column definition","tags":["table-columns"]}},"/tables/{table_id}/columns/reorder/":{"post":{"description":"Reorder a table's columns. The request must contain every column of the table exactly once. Cosmetic: no version bumps and no recompute run. Pass `group_membership` to move columns in or out of a column group in the same request, which is what dragging a column into a group does: the new order and the new membership land together, so the group is never momentarily split.","operationId":"reorder_table_columns","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnReorderRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Reorder table columns","tags":["table-columns"]}},"/tables/{table_id}/columns/run/":{"post":{"description":"Recompute the named columns over the named rows as ONE run, in dependency order. This is what a swept selection in the grid becomes.\n\nA column another named column feeds is planned once, after its input, so no column reads a value a sibling is still computing. Sending one request per column instead is what makes them race, and it also plans every shared dependent twice.\n\nCell-scoped: the rows are always explicit, and the grid's filter and sort do not narrow them. The response's run is null while the workflow start is still queued; the active-runs feed picks it up.","operationId":"run_table_columns","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnsRunRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnRunResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Run several columns over chosen rows","tags":["table-columns"]}},"/tables/{table_id}/columns/run/estimate/":{"post":{"description":"Estimate the credit cost of a bundled cell run without running it. Takes the same request body as the run endpoint so estimate and run can never disagree about scope. A column another named column feeds is counted once, which is why summing the per-column estimates gives a larger number.","operationId":"estimate_table_columns_run","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnsRunRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnRunEstimateResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Estimate the credit cost of a multi-column run","tags":["table-columns"]}},"/tables/{table_id}/columns/suggest-name/":{"get":{"description":"Suggest a free display name for a column from a base name: the base name itself when no column on the table already has it, or the first free \"<base> (n)\" variant, counting from 2. Free and changes nothing, the same name a column created right after would take.","operationId":"suggest_table_column_name","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"description":"The name to make unique.","in":"query","name":"base","required":true,"schema":{"description":"The name to make unique.","maxLength":255,"minLength":1,"title":"Base","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnNameSuggestionResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest a name for a new column","tags":["table-columns"]}},"/tables/{table_id}/columns/{column_id}/":{"delete":{"description":"Delete a column. Blocked while other formula columns depend on it, unless `replace_with_column_id` names the column their references should point at instead. The dependents are rewritten first, then the delete proceeds. Cancels ONLY the column's own lineage run; other active runs keep running and skip the deleted column. To delete a column together with its dependents (a whole column group, say), use the batch delete, where dependents inside the batch never block it.","operationId":"delete_table_column","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}},{"description":"Repoint dependent columns' references at this column before deleting. Omit to refuse the delete while dependents exist.","in":"query","name":"replace_with_column_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Repoint dependent columns' references at this column before deleting. Omit to refuse the delete while dependents exist.","title":"Replace With Column Id"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a table column","tags":["table-columns","mcp-searchable-tool"]},"patch":{"description":"Partially update a column (omitted fields are left untouched). The kind is immutable. A formula definition change requests a column-edited recompute run. It appears on the next active-runs poll; the response carries only the requires_recompute flag, never a run ID. Cosmetic edits and manual default_value edits request nothing. A type change that stores values differently converts every value it can; cleared_count is how many it could not convert and left blank, which the retype preview forecasts beforehand.","operationId":"update_table_column","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnUpdateResultSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a table column","tags":["table-columns"]}},"/tables/{table_id}/columns/{column_id}/distribution/":{"get":{"description":"Get exact value frequencies across every live row of a table, independent of view filters or loaded pages. Returns total, empty and distinct counts, the 20 most common values with counts and percentages of all rows, and other_count for nonempty values outside that list. Null, missing and whitespace-only text cells are empty; zero and false are values. Objects and arrays are whole values.","operationId":"get_table_column_distribution","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValueDistribution"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Column or source not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a table column's value distribution","tags":["table-columns","mcp-searchable-tool"]}},"/tables/{table_id}/columns/{column_id}/duplicates/":{"get":{"description":"Report which rows a dedupe of this column would delete, without deleting anything. The first row holding each repeated value is kept, in the table's display order; blank cells are never duplicates. The returned record IDs are the losers, ready to hand to the bulk row delete, capped at its own 1000-row limit, though duplicate_row_count carries the full number either way.","operationId":"preview_table_column_duplicates","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnDuplicatesResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Preview a column's duplicate rows","tags":["table-columns"]}},"/tables/{table_id}/columns/{column_id}/promote-field/":{"post":{"description":"Create a formula column that reads one declared output field out of a multi-field enrichment's payload. The child is typed by the field's declared type, dependency-linked to its parent, free to recompute, and immediately backfilled by its column-added run. With target_column_id, the field's current values instead overwrite an existing manual column. Destructive, and refused without confirm_overwrite.","operationId":"promote_enrichment_field","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnPromoteFieldRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Promote an enrichment output field into its own column","tags":["table-columns"]}},"/tables/{table_id}/columns/{column_id}/retype-preview/":{"get":{"description":"Report what changing a column's type would do to the values already in it, without changing anything. When the type is changed, each value is converted where the new type can read it: numbers, checkboxes, dates and lists become text (\"42\", \"true\", \"2026-09-24\", \"Hot, Warm\"), text like \"1,234\" becomes a number, \"yes\" or \"no\" becomes a checkbox, and comma separated text becomes a list. cleared_count is how many values the new type cannot read, which the change would leave blank. A change between types that store the same way, like text to URL, clears nothing.","operationId":"preview_table_column_retype","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}},{"description":"The type the column would change to.","in":"query","name":"column_type","required":true,"schema":{"$ref":"#/components/schemas/TableColumnType","description":"The type the column would change to."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnRetypePreviewResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Preview a column type change","tags":["table-columns","mcp-searchable-tool"]}},"/tables/{table_id}/columns/{column_id}/run/":{"post":{"description":"Request an on-demand recompute of one formula column: Run All, Run Errored, Run first N, or a single cell. all/errored/first_n share the column's lineage workflow: a broader run supersedes a narrower in-flight one, and cells already computed under the same definition are freshness-skipped. cell runs are origin-keyed and independent. The response's run is null while the workflow start is still queued (the run row is minted post-commit). The 2-second active-runs poll picks it up.","operationId":"run_table_column","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnRunRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnRunResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Run a formula column","tags":["table-columns"]}},"/tables/{table_id}/columns/{column_id}/run/estimate/":{"post":{"description":"Estimate the credit cost of an on-demand column run without running it. Takes the same request body as the run endpoint so estimate and run can never disagree about scope. Free runs (formula/manual columns) estimate to zero and are always sufficient.","operationId":"estimate_table_column_run","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnRunRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnRunEstimateResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Estimate the credit cost of a column run","tags":["table-columns"]}},"/tables/{table_id}/columns/{column_id}/ui-prefs/":{"patch":{"description":"Partially update how one column is displayed: hidden, pinned, width, colour tint (omitted fields are left untouched). Hidden, pinned and width are the CALLING USER's own: they change this person's Default view and nobody else's, over the team's layout. The colour tint is shared by everyone in the organisation. A caller with no person behind it (an API key) sets the team's layout. Cosmetic only: this never touches the column definition, never bumps the columns change watermark, and never requests a recompute run. A request that sets nothing is a no-op and leaves the preferences watermark unmoved. Answers with the column's preferences as the caller now sees them.","operationId":"update_table_column_ui_prefs","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnUIPrefsUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnUIPrefsSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a column's display preferences","tags":["table-ui-prefs"]}},"/tables/{table_id}/describe/":{"post":{"description":"Write a short description of what a table holds, from its name and its column names and types.\n\nA SUGGESTION, not a write: the response is put in front of the user to accept, edit or discard, and the table is only changed if they then save it. Cell values are never sent: the columns say what the table is about, and the rows are the customer data we have no reason to hand to a model to answer this question.","operationId":"describe_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableDescriptionSuggestionSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"description":"The model could not suggest a description right now."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Suggest a description for a table","tags":["tables"]}},"/tables/{table_id}/duplicate/":{"post":{"description":"Copy a table's structure (columns, types, formulas remapped onto the new columns, descriptions, the team's display preferences and the caller's own column layout) and optionally its rows and cell values. Nothing recomputes: the copy already holds the source's results, errors and staleness included. The copy sits in the same folder as the source and belongs to whoever made it.","operationId":"duplicate_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableDuplicateRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequiredResponse"}}},"description":"Plan table limit reached. Upgrade to create more tables."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Duplicate a table","tags":["tables"]}},"/tables/{table_id}/enrichment-audit-logs/":{"get":{"description":"List the durable audit trail of the table's enrichment actions (configured, edited, run at a scope, cancelled, and the settled per-column cost), newest first. Optionally scoped to one column. Kept indefinitely: the retention policy that strips verbose run records never touches this trail.\n\nA change the AI Assistant made through a granted workspace action lands as `assistant_applied`, naming the proposal it came from, so the change and the card that asked for it read together.","operationId":"list_enrichment_audit_logs","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"description":"Restrict to one column's entries.","in":"query","name":"column_id","required":false,"schema":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"Restrict to one column's entries.","title":"Column Id"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForCreatedAt","default":"created_at","enum":["created_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EnrichmentAuditLogReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List a table's enrichment audit trail","tags":["table-enrichment-audit-logs"]}},"/tables/{table_id}/events/":{"get":{"description":"Server-sent event stream of a table's changes: row cell deltas, run progress, and column / display-preference / row-set invalidation signals. Replaces the 2-second status poll, so an idle table costs nothing.\n\nDeltas carry the row's `version`, the same watermark the rows list carries, so applying one twice or out of order is a no-op. There is deliberately NO replay log: clients refetch once on every connect, and a mid-stream gap is reported as a `resync` frame meaning the same thing.\n\nThe server closes the stream after a few minutes with a `reconnect` frame; reconnect with a fresh token. Comment heartbeats keep intermediaries from dropping an idle connection.\n\nRequires Clerk authentication; API keys are rejected. There is deliberately no 404: an unknown or foreign table streams heartbeats only, because the channel is org-scoped and leaks nothing.","operationId":"stream_table_events","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/TableChangeEventSchema","type":"string"}}},"description":"A stream of change events; each SSE frame's `data` is one event object."},"401":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"HTTPBearer":[]}],"summary":"Stream a table's change events","tags":["table-events"]}},"/tables/{table_id}/export/":{"post":{"description":"Download a table's rows as a file. Two scopes: send `sorts`/`where`/`column_ids` to export what the grid is currently showing, or `record_ids` to export a specific row selection. The two are mutually exclusive.\n\n`format` picks the file, and it changes how values are written. A CSV holds everything as text: timestamps in ISO 8601, lists and objects as JSON, so the file round-trips back through an import. Free-text cells are neutralised against spreadsheet formula injection; numbers are not, so they stay summable.\n\nAn .xlsx keeps native types instead, so a number stays summable, a date sorts as a date and a checkbox is a real boolean. Nothing needs neutralising there, because a string cell is never evaluated as a formula.\n\nA CSV streams synchronously in keyset pages, so a large export starts downloading immediately. A workbook is a zip and cannot be streamed, so it is built in full before the response begins.","operationId":"export_table_rows","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableExportRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{},"text/csv":{}},"description":"The table as a CSV or Excel file."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Export table rows as a CSV or Excel file","tags":["table-export"]}},"/tables/{table_id}/favorite/":{"put":{"description":"Set whether the CALLING USER has this table starred. Favourites are per-user, not per-organisation: starring a table does not star it for a teammate.","operationId":"set_table_favorite","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableFavoriteUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableUserPrefsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Star or unstar a table","tags":["table-user-prefs"]}},"/tables/{table_id}/last-view/":{"get":{"description":"The CALLING USER's own: the query string of the table page's address when they last left it (its view, sort, filter and a view's hidden columns), or null when they left it as it opens for anyone. The dashboard opens a bare table address on it. Never a saved view: nobody else's table changes.","operationId":"get_table_last_view","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableLastViewSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Read the view the caller last left this table on","tags":["table-user-prefs"]},"patch":{"description":"Set the CALLING USER's own last view of this table: the query string of the table page's address (view, sort, filter, a view's hidden columns), or null to forget it. Per person, and never written into a saved view, so a running sequence that reads a view is never changed by it.","operationId":"set_table_last_view","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableLastViewUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableLastViewSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Remember the view the caller is leaving this table on","tags":["table-user-prefs"]}},"/tables/{table_id}/purge/":{"delete":{"description":"Permanently destroy a table that is already in the trash, along with every column, row and cell it holds. This cannot be undone.\n\nOnly works on a table that has already been trashed, so it can never be the first thing that happens to live data.","operationId":"purge_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found in trash"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Destroy a trashed table for good","tags":["tables"]}},"/tables/{table_id}/restore/":{"post":{"description":"Bring a trashed table back, with every column, row and cell it held, into the folder it was in (the top level when that folder is in Trash too).\n\nFails if a live table has taken its name in the meantime. One of the two has to be renamed first, and this endpoint will not guess which.","operationId":"restore_table","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found in trash"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Restore a trashed table","tags":["tables"]}},"/tables/{table_id}/rows/":{"post":{"description":"Append up to 1000 empty rows to the table (one by default) and request a SINGLE row-added recompute run scoped to all of them. The row cap is enforced atomically over the whole batch, so the append is all-or-nothing. Passing after_record_id or before_record_id instead inserts exactly one row directly below or above that row, touching no other row's position. The run appears on the next active-runs poll; the response never carries a run ID, and a table with no formula columns discards the request at plan time.","operationId":"create_table_rows","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsCreatedResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or anchor row not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create table rows","tags":["table-rows"]}},"/tables/{table_id}/rows/add-to-sequence/":{"post":{"description":"The grid's 'Add to sequence' action. Rows already enrolled, without an email, or over the per-company cap are skipped, and the count says so. The sequence must target this table as its audience.","operationId":"add_rows_to_sequence","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolRowsRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolRowsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Add grid rows to a sequence","tags":["sequences"]}},"/tables/{table_id}/rows/count/":{"post":{"description":"How many rows a predicate matches, with no rows read.\n\nTakes the `where` and `row_status` vocabulary of the rows query, so a saved view's own filter can be counted by sending it back verbatim: that is how a picker can say what choosing a view will actually select before anything is bound to it.\n\nAn unfiltered count is free: it reads the table's maintained counter rather than scanning. A filtered one is an exact COUNT over the same predicate the listing applies, never an estimate, so the number cannot disagree with the rows the client goes on to fetch.\n\nA POST for the same reason the rows query is one: a filter list has no honest query-string encoding.","operationId":"count_table_rows","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsCountRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsCountSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count the rows a filter selects","tags":["table-rows"]}},"/tables/{table_id}/rows/delete/":{"post":{"description":"Delete up to 1000 rows by record ID, or (with `all: true`) every row the listing matches, optionally narrowed by `where`/`row_status` (the rows query's own predicate vocabulary). Record IDs that do not exist are simply absent from the result; a predicate delete reports only the count. Row deletion has no recompute effect, so no run is requested.","operationId":"bulk_delete_table_rows","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsDeleteSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsDeletedResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Bulk delete table rows","tags":["table-rows"]}},"/tables/{table_id}/rows/ids/":{"post":{"description":"Get the record IDs a listing selects, in order, carrying NO cell data.\n\nTakes the same `sorts`, `where` and `row_status` vocabulary as the rows query and answers only the membership-and-order half of it. Pages are correspondingly large (the default is 10,000 IDs) because a page of IDs is a fraction of the size of a page of rows.\n\nPair it with the rows query's `record_ids` mode: fetch an ordering once, then hydrate contents a window at a time. A client holding both can re-sort or re-filter by refetching only the ordering, and reuse every cell it already has.\n\nA POST for the same reason the rows query is one: a filter list has no honest query-string encoding.","operationId":"query_table_row_ids","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowIdsQueryRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowIdsPageSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Query a listing's row IDs","tags":["table-rows"]}},"/tables/{table_id}/rows/query/":{"post":{"description":"List a table's rows with keyset pagination on an opaque cursor. Without a sort, rows come in DISPLAY order: the user-controlled row position, with the time-ordered record ID as a tiebreak. With one, they come in that column's value order, and rows with no value for it sort LAST in both directions. Filters are predicates on cell values and compose with either order.\n\n`column_ids` projects each row's cells: send the columns the grid will render and the response carries only those. It echoes the projection back, so a column outside it reads as 'not fetched' rather than 'blank'.\n\nA POST because a filter list has no honest query-string encoding. Each cell's computing flag is derived: stale AND an active run covers that row.\n\nPerformance note: an unfiltered sort streams the column's index. Add a filter and Postgres sorts the matched set instead, so a filter that matches most of a very large table is correspondingly slower.","operationId":"query_table_rows","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsQueryRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsPageSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Query table rows","tags":["table-rows"]}},"/tables/{table_id}/rows/run/":{"post":{"description":"Recompute up to 1000 rows across the WHOLE dependency graph (every formula, enrichment and export column) in dependency order, as one run. This is what makes a row run correct rather than merely parallel: a column whose input another column in the same request produces waits for it, instead of reading an empty cell and skipping. `run` is null while the workflow start is still queued; the active-runs poll picks it up.","operationId":"run_table_rows","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsRunRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsRunResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Run selected rows","tags":["table-rows"]}},"/tables/{table_id}/rows/run/estimate/":{"post":{"description":"Estimate the credit cost of a row run without running it. Takes the same request body as the run endpoint (a named selection, or every row the current listing matches), so estimate and run can never disagree about scope.","operationId":"estimate_table_rows_run","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowsRunRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableColumnRunEstimateResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Estimate the credit cost of a row run","tags":["table-rows"]}},"/tables/{table_id}/rows/search/":{"post":{"description":"Find cells whose text contains the query, anywhere in the table, and report where each one sits in the listing the client is currently showing, so the grid can scroll to a match rather than only highlight the page it is on. TEXT columns only: a number or a date would have to be rendered to be matched as text, and how it renders is a client-side question, so a server-side answer could disagree with the cell on screen. Send the grid's current `sorts` and `where`; an offset counted against a different listing points at the wrong row.","operationId":"search_table_rows","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowSearchRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRowSearchResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"A sort or filter names a column this table does not have"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Search a table's cells","tags":["table-rows"]}},"/tables/{table_id}/rows/{record_id}/cells/{column_id}/feedback/":{"delete":{"description":"Remove the signed-in user's verdict on one cell. Pressing the same thumb twice means taking it back, which has to differ from never having said anything.","operationId":"clear_cell_feedback","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Withdraw your feedback on a cell","tags":["table-rows"]},"get":{"description":"The signed-in user's own verdict on one cell, or null if they have not given one. Feedback is per person: two people are meant to be able to disagree about the same value.","operationId":"get_cell_feedback","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CellFeedbackResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get your feedback on a cell","tags":["table-rows"]},"put":{"description":"Record the signed-in user's verdict on one produced value, with an optional note saying what was wrong. Re-rating the same cell replaces the earlier verdict rather than adding a second one. Only a column that runs a saved agent can be rated, because feedback exists to improve an agent, and a column with none has nothing to collect it for.","operationId":"rate_cell","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CellFeedbackRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CellFeedbackSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or column not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Rate a cell's value","tags":["table-rows"]}},"/tables/{table_id}/rows/{record_id}/cells/{column_id}/run-detail/":{"get":{"description":"The cell's most recent enrichment execution: the resolved prompt, action and model, outcome, duration, and the agent's investigation (reasoning, confidence, steps, sources) when there was one. Raw provider responses are never stored, so nothing internal can leak.","operationId":"get_cell_run_detail","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"record_id","required":true,"schema":{"format":"uuid","title":"Record Id","type":"string"}},{"in":"path","name":"column_id","required":true,"schema":{"format":"uuid","title":"Column Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichmentCellRunSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Cell has no run record"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a cell's enrichment run detail","tags":["table-rows"]}},"/tables/{table_id}/run/errored/":{"post":{"description":"Re-run ONLY the cells that failed, across every formula column of the table: the 'fix what broke' action.\n\nA table-level endpoint rather than a client-side loop over columns: each column still passes through its own credit gate and lineage workflow, but the column list is resolved once and the request cannot half-complete.\n\nColumns whose workflow start is still queued contribute no run to the response; the active-runs poll picks those up.","operationId":"run_table_errored_cells","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableErroredRunResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Re-run every failed cell in the table","tags":["table-columns"]}},"/tables/{table_id}/runs/":{"get":{"description":"List a table's recompute runs with optional status and trigger filtering.","operationId":"list_table_runs","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"query","name":"filters","required":true,"schema":{"$ref":"#/components/schemas/ListTableRunsFilterParamsSchema"}},{"description":"The number of items to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"The number of items to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},{"in":"query","name":"order_by","required":false,"schema":{"$ref":"#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAt","default":"id","enum":["id","created_at","updated_at"],"type":"string"}},{"in":"query","name":"order_direction","required":false,"schema":{"default":"asc","enum":["asc","desc"],"title":"Order Direction","type":"string"}},{"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set the cursor to the next or previous page. You can get the cursor from the previous page's response.","title":"Cursor for pagination."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TableRunReadSchema_"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List table runs","tags":["table-runs"]}},"/tables/{table_id}/runs/stop/":{"post":{"description":"The global Stop Run action: flip every active run of the table to cancelling in one update. Running pages observe the flip within about a second and each workflow finalizes its run as cancelled. Answers already in the table stay; a cell still computing is dropped uncharged; remaining cells are skipped. Idempotent: an empty list when nothing was active.","operationId":"stop_table_runs","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableStoppedRunsResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Stop all table runs","tags":["table-runs"]}},"/tables/{table_id}/runs/{run_id}/cancel/":{"post":{"description":"Request cancellation of one active run: the run flips to cancelling, its running pages observe the flip within about a second (answers already in the table stay; a cell still computing is dropped uncharged), and the workflow finalizes the run as cancelled. Edge case: a cancel accepted after the final page has already computed finalizes the run as completed (or completed_with_errors) instead of cancelled.","operationId":"cancel_table_run","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"run_id","required":true,"schema":{"format":"uuid","title":"Run Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableRunReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table run not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Cancel a table run","tags":["table-runs"]}},"/tables/{table_id}/schedule/":{"delete":{"description":"The source stays attached; only the recurring run stops.","operationId":"delete_table_schedule","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Stop a table refreshing on a cadence","tags":["table-schedules"]},"get":{"description":"Read how often a table re-imports.","operationId":"get_table_schedule","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableScheduleSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table has no schedule"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a table's refresh cadence","tags":["table-schedules"]},"patch":{"description":"Editing the cadence re-anchors it: 'every 3 days' set today means three days from today. Resuming a paused schedule on its own does NOT: it keeps firing at the same time of day (or the same interval) the schedule was already on, just moved to the next upcoming occurrence, so a schedule left paused for a month neither fires the moment it comes back nor drifts to a new time.","operationId":"update_table_schedule","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTableScheduleRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableScheduleSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table has no schedule"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Change a table's refresh cadence","tags":["table-schedules"]},"post":{"description":"Re-import on a cadence. The presets are calendar statements (monthly on the same date, quarterly in the same month) while `custom` is an interval counted from when you set it up.\n\nThe response carries the next few fire times, so a cadence can be checked before it is left to run unattended.\n\nTurning on `delete_missing_rows` makes every scheduled run re-list the whole source: a changes-only fetch cannot tell a deleted record from an unchanged one, and treating the difference as deletion would empty the table.","operationId":"create_table_schedule","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTableScheduleRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableScheduleSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Set a table's refresh cadence","tags":["table-schedules"]}},"/tables/{table_id}/source/":{"delete":{"description":"Stops the table refreshing. Rows, columns and values are all left exactly as they are; the imported-record column simply stops being updated. Deleting it would take every column extracted from it too, which is a much bigger thing than detaching a source.","operationId":"delete_table_import_integration","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Detach a table's import source","tags":["table-sources"]},"get":{"description":"The connected tool a table's rows are imported from. Null for a table no tool fills: typed by hand, loaded from a file, or built by a lead search.","operationId":"get_table_import_integration","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TableSourceSchema"},{"type":"null"}],"title":"Response Get Table Import Integration"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get a table's import source","tags":["table-sources"]},"patch":{"description":"Only the row limit is editable here. The integration and the record type define what the table's existing rows ARE. Changing either would import a different population over them rather than refresh them, so a different source means a different table. The field rows are matched on changes through the identity-field route, which re-keys the rows with it.","operationId":"update_table_import_integration","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTableSourceRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSourceSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table has no source"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a table's import source","tags":["table-sources"]}},"/tables/{table_id}/source/identity-field/":{"put":{"description":"Match a connected-tool table's rows on a different id field from now on, for example the tool's own record id instead of an email address. Every imported row is re-keyed from the record it already stores, all at once: no row is deleted, merged or added, and every column and value stays. Refused while an import is running, when some records or rows have no value for the field, when two share one, or when the rows store it in a form a refresh cannot match; the identity options route says which applies beforehand. A field people can edit in the tool brings an edited record back as a new row on the next refresh.","operationId":"update_table_import_integration_identity_field","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTableSourceIdentityRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSourceSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table has no source"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Change the field a table's imported rows are matched on","tags":["table-sources"]}},"/tables/{table_id}/source/identity-options/":{"get":{"description":"For a table fed by a connected tool: every id field its records carry, which one the rows are matched on now, and what switching to each would do. Reads one fresh sample from the tool (whether every record carries the field and no two share it) and the table's own rows (how many have no value for it and how many share one). `available` says whether the switch can be made; `problem` says why not. Changes nothing.","operationId":"list_table_import_integration_identity_options","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SourceIdentityOptionSchema"},"title":"Response List Table Import Integration Identity Options","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table has no source"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List the fields a table's imported rows could be matched on","tags":["table-sources"]}},"/tables/{table_id}/source/promote-field/":{"post":{"description":"Creates a formula column that reads the path out of the imported-record column, and backfills it.\n\nA formula rather than a copy, deliberately: it tracks the record through every refresh, where copied values would go stale the first time the record changed.","operationId":"promote_source_field","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteSourceFieldRequestSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteSourceFieldResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table has no source"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Give one field of the imported record its own column","tags":["table-sources"]}},"/tables/{table_id}/source/run/":{"post":{"description":"Start an import immediately. Where the provider supports it and the table has synced before, only records changed since the last successful run are fetched; otherwise everything is re-listed.\n\n`full_relist` re-fetches every record without deleting anything. `delete_missing_rows` additionally removes rows whose records the source no longer returns: a separate, destructive ask, refused while the source has a row limit.\n\nRefused while an import is already running: two concurrent imports would race the same rows.","operationId":"run_table_import_integration","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RunTableSourceRequestSchema"},{"type":"null"}],"title":"Body"}}}},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableSourceRunSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table has no source"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Refresh a table from its source now","tags":["table-sources"]}},"/tables/{table_id}/source/runs/":{"get":{"description":"A connected-tool table's import runs, newest first: what each added, updated and removed, how many records it skipped and why, whether it stopped at the row limit, and why a failed one failed. `status` narrows to one outcome, e.g. `succeeded` for the refresh the table last shows.","operationId":"list_table_import_integration_runs","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"description":"Most runs to return.","in":"query","name":"limit","required":false,"schema":{"default":10,"description":"Most runs to return.","maximum":50,"minimum":1,"title":"Limit","type":"integer"}},{"description":"Only runs with this outcome.","in":"query","name":"status","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/TableSourceRunStatus"},{"type":"null"}],"description":"Only runs with this outcome.","title":"Status"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TableSourceRunSchema"},"title":"Response List Table Import Integration Runs","type":"array"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table has no source"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List a table's recent imports","tags":["table-sources"]}},"/tables/{table_id}/stats/":{"get":{"description":"Get aggregate stats for one table: row count, columns per kind, failed cell count, the newest active run (if any), and whether the table is at its row cap.","operationId":"get_table_stats","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableStatsSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get table stats","tags":["tables"]}},"/tables/{table_id}/status/":{"get":{"description":"A table's active runs plus change watermarks for rows, columns, display preferences, and the definition, in one response.\n\nNOT A POLLING TARGET. The grid now receives changes over the change feed (`GET /tables/{table_id}/events/`) and fetches this once on load for its initial active-run state. It remains useful to any client that wants a cheap point-in-time snapshot without opening a stream.\n\nPreferences are watermarked separately from columns so a hide, pin, resize, or recolour refreshes the column list alone. A client comparing two responses must compare for inequality, never ordering: max timestamps can move backward when the newest row or column is hard-deleted (the counts catch deletes). All timestamps are server-generated; never compare them to the client clock. There is deliberately no table-existence 404: an unknown or foreign table returns empty runs and null/zero watermarks, which leaks nothing (same no-leak contract as the active-runs endpoint). The org-scoped definition read gates the row aggregate, so a foreign table ID never reaches the (potentially large) row index.","operationId":"get_table_status","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableStatusSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Get table change status","tags":["tables"]}},"/tables/{table_id}/template/":{"get":{"description":"PUBLIC, no sign-in. Serves a table's SHAPE (its columns, their configuration, and what each column holds in words) when, and only when, its owner has turned on `shared_as_template`. A table that has not opted in answers 404 exactly as a non-existent one does, so an id alone reveals nothing. Never serves a row or a cell value.","operationId":"get_shared_table_template","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedTableTemplateSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"summary":"Read a table published as a template","tags":["tables"]}},"/tables/{table_id}/viewed/":{"post":{"description":"Note that the CALLING USER just opened this table, which is what feeds their recently-opened list. Best-effort: clients fire it on open and ignore the result. Never touches the starred flag: opening a table says nothing about whether the user wants it starred.","operationId":"record_table_view","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableUserPrefsReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Record that the caller opened this table","tags":["table-user-prefs"]}},"/tables/{table_id}/views/":{"get":{"description":"List all saved views of a table in position-then-name order (non-paginated by design: the view switcher renders them all at once).","operationId":"list_table_views","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableViewListResponseSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"List table views","tags":["table-views"]},"post":{"description":"Create a saved view: a named, org-shared sort/filter/hidden-column bundle the client applies on top of the live table. Views never touch the table's display preferences, and creating one recomputes nothing.\n\n`is_default` claims the table's default slot: the view a link naming none opens on, for a person with no last view of the table. At most one view per table holds it, so claiming it stands down the previous holder in the same transaction.","operationId":"create_table_view","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableViewCreateSchema"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableViewReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Create a table view","tags":["table-views"]}},"/tables/{table_id}/views/{view_id}/":{"delete":{"description":"Delete a saved view. The table, its columns, and its rows are untouched; a view is only a stored way of looking at them. Refused while a draft, running or paused sequence reads its contacts through the view, naming them: change their audience first.","operationId":"delete_table_view","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"view_id","required":true,"schema":{"format":"uuid","title":"View Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessfullyDeletedResponse"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or view not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Delete a table view","tags":["table-views"]},"patch":{"description":"Partially update a saved view's name, description, position, default flag, or configuration (omitted fields are left untouched; an all-omitted body writes nothing).\n\n`is_default: true` moves the table's default slot to this view, standing down whichever held it; `false` clears it, leaving the table with no default.","operationId":"update_table_view","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"view_id","required":true,"schema":{"format":"uuid","title":"View Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableViewUpdateSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableViewReadSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table or view not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Update a table view","tags":["table-views"]}},"/tables/{table_id}/views/{view_id}/sequence-impact/":{"post":{"description":"Before a view's filter is saved, says for each draft, running or paused sequence that reads its contacts through the view how many contacts the new filter adds, removes (they stop, reading Left the audience) and leaves unchanged. Saving the filter applies it to those sequences at once. A sequence that does not keep in sync with its table ignores the edit and carries no counts. Writes nothing.\n\nA POST for the same reason the rows query is one: a filter list has no honest query-string encoding.","operationId":"preview_table_view_sequence_impact","parameters":[{"in":"path","name":"table_id","required":true,"schema":{"format":"uuid","title":"Table Id","type":"string"}},{"in":"path","name":"view_id","required":true,"schema":{"format":"uuid","title":"View Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableViewSequenceImpactRequestSchema"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableViewSequenceImpactListSchema"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundResponse"}}},"description":"Table not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnprocessableEntityResponse"}}},"description":"Invalid request made to the API."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Internal server error."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Bad gateway error."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerErrorResponse"}}},"description":"Service unavailable."}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"summary":"Count what a new filter does to the sequences that follow a view","tags":["table-views"]}}},"tags":[{"description":"The docked AI Assistant: its general chat about the workspace and the product, streamed as Server-Sent Events, and the one list of a person's threads across every assistant, with pin, rename, delete and the search-to-table link.","name":"assistant"},{"description":"The messages a person keeps to send the assistant again: the ones the workspace saved and the ones that ship with the product, with save, rename, edit and delete.","name":"assistant-prompt"},{"description":"Granted workspace actions: what the AI Assistant proposed or applied in a conversation, the approve and dismiss decisions on each card, the workspace's approval threshold and default grants, and the eight verbs.","name":"workspace-actions"},{"description":"The Getting started checklist: a workspace's progress through the six steps from its first people search to its first launched sequence.","name":"onboarding"},{"description":"Senders, connected mailboxes, tags, and the Google connect flow.","name":"senders"},{"description":"The workspace do-not-contact list, enforced before every send.","name":"suppression"},{"description":"The workspace's recontact rule: how long before anyone hears from us again.","name":"contact_cooldown"},{"description":"Sequence authoring: the graph, the table-backed audience, previews.","name":"sequences"},{"description":"The outbound agent behind a sequence: the voice it writes in, its per-message prompts, what it wrote and what people told it.","name":"outbound-agents"},{"description":"The LinkedIn channel: connecting an account to a sender, its safety limits and history, and the protocol the browser extension speaks.","name":"linkedin"},{"description":"The approval queue: everything waiting on a person across every sender and channel, and the workspace's manual or automatic modes per channel.","name":"outreach"},{"description":"The unified outreach inbox: threads, replies, labels, events.","name":"inbox"},{"description":"The AI reply layer: workspace settings, drafts, and approval.","name":"inbox-ai"},{"description":"Notification rules, per-user preferences, and the Slack connection.","name":"notifications"},{"description":"Endpoints for seeing all available integration types.","name":"integration-types"},{"description":"Endpoints for creating and managing integrations.","name":"integrations"},{"description":"Endpoints for the generic OAuth install/claim app-listings engine.","name":"app-listings"},{"description":"Endpoints for creating and managing API keys.","name":"apikey"},{"description":"AI apps connected to the workspace: Claude, ChatGPT, Claude Code or any other MCP client a person signed in to Oneprofile's MCP server with.","name":"ai_apps"},{"description":"Endpoints for managing billing and subscription information.","name":"billing"},{"description":"Endpoints for the Help Scout support Beacon.","name":"helpscout"},{"description":"Endpoints for development tools and presets. Not available in production.","name":"devtools"},{"description":"Endpoints for creating and managing tables.","name":"tables"},{"description":"Endpoints for table columns, formula previews, and on-demand column runs.","name":"table-columns"},{"description":"Endpoints for table rows and manual cell edits.","name":"table-rows"},{"description":"Endpoints for observing and cancelling table recompute runs.","name":"table-runs"},{"description":"Endpoints for org-shared per-column display preferences: hidden, pinned, width, and colour tint.","name":"table-ui-prefs"},{"description":"Endpoints for the org-shared names given to the column tint palette: what this organisation calls each colour. Org-level, not per-table.","name":"table-column-color-labels"},{"description":"Endpoints for the enrichment action catalog, model list, presets, draft generation, and saved agents.","name":"table-enrichments"},{"description":"Endpoints for teaching a saved agent from example rows: training sessions, per-row feedback, and the proposed prompt to approve.","name":"agent-training"},{"description":"The durable audit trail of a table's enrichment actions: configured, edited, run, cancelled, and settled cost.","name":"table-enrichment-audit-logs"},{"description":"Endpoints for saving and applying column templates.","name":"table-templates"},{"description":"Server-sent change feed for a table's grid.","name":"table-events"},{"description":"Endpoints for org-shared saved table views: sort, filters, hidden columns.","name":"table-views"},{"description":"Endpoints for PER-USER table preferences: favourites and recently opened. Unlike the rest of the table surface these are personal, so two members of one organisation legitimately see different answers.","name":"table-user-prefs"},{"description":"Endpoints for building a table from an uploaded CSV: upload and preview the inferred columns, commit the reviewed mapping, then poll the row load.","name":"table-imports"},{"description":"Endpoint for downloading a table's rows as CSV.","name":"table-export"},{"description":"Endpoints for the integration a table imports from: attach and preview it, promote imported fields into columns, and run the import on demand.","name":"table-sources"},{"description":"Endpoints for a table's recurring import cadence: set it, pause it, and read the next fire times.","name":"table-schedules"},{"description":"Endpoints for pushing a table's rows out to a connected integration: list writable destinations, derive their write capabilities, and map export columns.","name":"table-writeback"},{"description":"Endpoints backing a lookup column's setup: the connections whose records a column could read, and the identity fields one record type can be looked up by.","name":"table-integration-lookup"},{"description":"Endpoints for sourcing leads from the lead database: count and preview matches, land them in a table, and keep saved searches. Alongside people and company searches, leads can be sourced from buying signals (what a company or person just did), with a catalogue endpoint behind the picker that builds them.","name":"find-leads"},{"description":"Endpoints for discovering a domain's subdomains from public certificate logs and landing the results in a table.","name":"find-subdomains"},{"description":"Endpoints for the credit balance meter and usage reporting.","name":"credits"},{"description":"Endpoints for the workspace referral program: the shareable link, the friends who joined through it, and claiming a code after signup.","name":"referral"},{"description":"Endpoints for the affiliate program's own dashboard: enrolling and claiming a code, the summary, stats and activity feed, the commission ledger, and identity verification and payouts.","name":"affiliate"},{"description":"Endpoints for recording where a new workspace came from: the marketing page or campaign its signup link carried, sent once after signup.","name":"attribution"},{"description":"Endpoints for the design partner program's customer surface: whether this workspace is a design partner, the badges its feedback has earned, and sending and reading that feedback.","name":"design-partner"},{"description":"Endpoints for the org-level AI business context (company description, ideal customer profile, buyer personas, interest signals and social proof), plus domain-based generation and the reference documents whose summaries ride alongside those fields.","name":"ai-context"},{"description":"Endpoints for the signed-in user's Google Drive connection: starting and finishing the OAuth grant, checking or dropping it, and minting the short-lived token the Google Picker needs.","name":"google-drive"}]}