{"componentChunkName":"component---src-templates-redoc-operation-js","path":"/docs/leadconduit/api/tag/Exports/","result":{"data":{"contentItem":{"type":"redoc-operation","link":"/docs/leadconduit/api/tag/Exports/","data":{"redocStoreStr":"{\"menu\":{\"activeItemIdx\":-1},\"definition\":{\"data\":{\"openapi\":\"3.1.0\",\"info\":{\"title\":\"LeadConduit API\",\"version\":\"1.0.1\",\"termsOfService\":\"https://activeprospect.com/terms-of-service/\",\"contact\":{\"name\":\"ActiveProspect Support Team\",\"email\":\"support@activeprospect.com\",\"url\":\"https://support.activeprospect.com\"},\"description\":\"# About\\nThis documentation is a technical manual for the LeadConduit API. It is\\nprimarily intended to be read by software developers who want to integrate\\nanother system with LeadConduit.\\n\\nThe API is RESTful and speaks JSON over HTTPS. In general, anything that\\ncan be accomplished by pointing and clicking in the LeadConduit user\\ninterface can also be done using the API.\\n\\n## Conventions\\nThis documentation provides examples that show how to interact with the\\nAPI. Examples are shown in monospaced blocks like the one shown below:\\n\\n```\\nExamples are presented in blocks like this one\\n```\\n\\nYou may also see monospaced font inline `like this`. This text represents a\\nliteral value or expression to be used with the API.\\n\\n## Questions\\nIf you have a question, or spot an error in the documentation, or just\\ngenerally need to speak with someone about the API, email\\n[support@activeprospect.com](mailto:support@activeprospect.com).\\n\"},\"servers\":[{\"url\":\"https://app.leadconduit.com\",\"description\":\"The base URL for production.\"}],\"security\":[{\"APIKey\":[]}],\"tags\":[{\"name\":\"Destinations\",\"description\":\"Destinations are reusable configurations that define where and how lead data is sent to external systems after processing in a flow. They represent the final delivery point for qualified leads, whether that's a CRM, marketing automation platform, partner system, or any other business application.\\n\\n## Key Concepts\\n\\n### What Are Destinations?\\n\\nDestinations are pre-configured connections to external systems that receive lead data. Unlike recipient steps that are configured individually within each flow, destinations are configured once at the account level and can then be reused across multiple flows. This \\\"configure once, use many times\\\" approach ensures consistency and reduces setup time.\\n\\n### Powered by Prismatic\\n\\nDestinations are powered by Prismatic, an embedded integration platform that provides:\\n- A marketplace of pre-built integrations for popular business systems\\n- Secure credential management\\n- Field mapping capabilities\\n- Multiple actions per destination (e.g., \\\"Create Lead\\\", \\\"Update Contact\\\", \\\"Add to Campaign\\\")\\n\\n## Configuration Process\\n\\nDestinations must be configured through the LeadConduit application interface because the setup process requires:\\n\\n1. **Integration Selection**: Browse and select from a marketplace of pre-built integrations (Salesforce, HubSpot, Marketo, custom webhooks, etc.)\\n\\n2. **Authentication Setup**: Securely configure credentials for the external system, which may involve:\\n   - OAuth authorization flows\\n   - API key management\\n   - Username/password authentication\\n   - Custom authentication headers\\n\\n3. **Instance Configuration**: Define specific settings for your instance of the integration:\\n   - Which Salesforce organization to connect to\\n   - Which HubSpot account to use\\n   - Which mailing lists or campaigns to target\\n   - Custom endpoint URLs for webhooks\\n\\n4. **Field Mapping**: Interactively map LeadConduit fields to destination fields:\\n   - Match lead fields to CRM fields\\n   - Set default values\\n   - Configure data transformations\\n   - Handle custom fields\\n\\n5. **Testing & Validation**: Verify the connection works properly before using in production flows\\n\\n## Using Destinations in Flows\\n\\nOnce configured, destinations can be:\\n- Queried via the API to see all available destinations\\n- Added to flows programmatically via the API\\n- Reused across multiple flows without reconfiguration\\n- Updated centrally with changes reflected in all flows using them\\n\\n### Delivery Rules\\n\\n- Lead data is only sent to a destination if all prior flow steps complete successfully\\n- Any error in preceding steps will prevent delivery to protect data quality\\n- Each destination can support multiple actions, allowing different operations on the same system\\n\\n### Multiple Actions\\n\\nA single destination can offer multiple actions. For example, a Salesforce destination might provide:\\n- \\\"Create New Lead\\\" - Adds a new lead record\\n- \\\"Update Existing Contact\\\" - Updates contact information\\n- \\\"Add to Campaign\\\" - Enrolls the lead in a marketing campaign\\n- \\\"Create Opportunity\\\" - Converts qualified leads to opportunities\\n\\n## API Capabilities\\n\\nWhile destinations cannot be created or modified via the API, you can:\\n- List all configured destinations for your account\\n- View destination details including available actions\\n- See which flows use each destination (with `include=flow_usages` parameter)\\n- Add existing destinations to flows\\n- Remove destinations from flows\"},{\"name\":\"Flows\",\"description\":\"Flows define the complete processing pipeline for lead submissions, from data ingestion through delivery. Each flow creates a configurable handler that processes leads through a series of middleware steps in strict sequence.\\n\\n## Flow Processing Architecture\\n\\n### Lead Submission Process\\nWhen a lead is submitted to a flow's source endpoint, it passes through a predetermined middleware chain organized into distinct phases:\\n\\n**Setup:**\\n1. **Lead submission** - Request received\\n2. **Authentication** - Verify source credentials and permissions\\n\\n**Inbound Request Processing:**\\n1. **Inbound integration** - Execute source-specific request handling\\n1. **Data hygiene** - Clean and validate field names and values\\n1. **Inbound mapping** - Transform source field names to flow field names\\n1. **Lead object creation** - Parse data using configured field types\\n\\n**Inbound Validation:**\\n1. **Suppression list checks** - Verify against do-not-contact lists\\n2. **Pricing calculation** - Apply source and flow pricing rules\\n3. **Caps validation** - Check submission limits\\n4. **Acceptance criteria** - Evaluate business rules for lead acceptance\\n\\n**Steps Execution:**\\n1. **Step processing** - Execute configured filter and recipient steps sequentially\\n2. **Revenue calculation** - Calculate final pricing and revenue\\n1. **Inbound integration** - Execute source-specific response \\n4. **Respond** - Return the integration response to source\\n\\n### Multi-Source Configuration\\nFlows accommodate multiple data sources through the `sources` array. Each source has:\\n- **Entity reference** - Identifies the submitting party\\n- **Inbound mappings** - Field name transformations specific to that source\\n- **Authentication settings** - Credentials and security requirements\\n- **Pricing configuration** - Source-specific cost calculations\\n\\n### Step-Based Processing\\nThe `steps` array defines sequential processing after lead acceptance. Steps are combined with any configured `destinations` and executed in order.\\n\\n**Step Types:**\\n- **Filter steps** - Apply business logic, data enhancement, routing decisions, or flow control\\n- **Recipient steps** - Deliver leads to external systems (CRMs, buyers, etc.)\\n\\n**Step Execution Details:**\\n- Steps execute sequentially, one at a time\\n- Each step can access and modify the lead data\\n- Disabled steps (`enabled: false`) are skipped but counted\\n- Filter steps can terminate the entire flow early using rules\\n- Each step generates an event record with timing and outcome data\\n- Step failures don't stop subsequent steps unless the step explicitly exits the flow\\n- The lead object accumulates data from all steps, making enhanced data available to later steps\\n\\n**Recipient Step Processing Pipeline:**\\nRecipient steps mirror the inbound validation structure but in reverse - transforming data for outbound delivery:\\n\\n1. **Integration lookup** - Load the outbound integration module\\n2. **Rules evaluation** - Check if step should execute (skip if rules fail)\\n3. **Outbound mapping** - Transform lead data for recipient requirements\\n4. **Type parsing** - Convert data to integration's expected types\\n5. **Integration validation** - Verify prerequisites are met\\n6. **Caps checking** - Apply step-level volume limits\\n7. **HTTP request execution** - Send data to external system\\n8. **Response processing** - Parse integration response\\n9. **Data appending** - Add response data back to lead object\\n10. **Event recording** - Save step execution details and outcome\\n\\n**Step Configuration:**\\n- **Entity reference** - Defines which integration module to use\\n- **Mappings** - Transform lead data for the specific recipient\\n- **Rules** - Conditional logic determining when the step executes\\n- **Enabled flag** - Allows steps to be temporarily disabled\\n\\n### Configuration Components\\nFlows are composed of:\\n- **Fields array** - Defines expected data schema and types\\n- **Sources array** - Configures data input endpoints\\n- **Steps array** - Defines post-acceptance processing\\n- **Acceptance criteria** - Rules determining lead purchase decisions\\n- **Pricing configuration** - Cost calculation logic\\n- **Caps** - Volume and rate limiting controls\\n\"},{\"name\":\"Fields\",\"description\":\"Fields define your lead data model in LeadConduit. They specify what information you collect, how it's structured, and what types of data are valid. Think of fields as the columns in your lead database - each field represents a specific piece of information about a lead, from basic contact details to complex business-specific data.\\n\\n## Why Fields Matter\\n\\nWithout a consistent data model, lead processing becomes chaos. Every vendor sends different field names, every system expects different formats, and data quality suffers. Fields solve this by:\\n\\n- **Standardizing Data** - Common fields work the same way everywhere\\n- **Enforcing Types** - Each field knows what kind of data it holds\\n- **Enabling Validation** - Invalid data is caught and flagged\\n- **Supporting Intelligence** - Typed fields provide parsed components\\n\\n## Standard vs Custom Fields\\n\\nLeadConduit provides two categories of fields:\\n\\n### Standard Fields\\n\\nPre-defined fields for common lead data:\\n\\n| Category        | Examples                                             | Purpose                  |\\n|-----------------|------------------------------------------------------|--------------------------|\\n| **Contact**     | Email, Phone 1, Phone 2, Phone 3                     | Core contact information |\\n| **Identity**    | First Name, Last Name, Age, Gender                   | Personal identification  |\\n| **Location**    | Address 1, Address 2, City, State, Postal Code       | Home Address             |\\n| **Many Others** | Hundreds of standard fields by vertical and use case | Misc.                    | \\n\\nA built-in standard field catalog provides consistent field names and normalized values\\nacross all flows and accounts dramatically reducing the operational cost of maintaining\\ndata integrations between parties. \\n\\n**We strongly encourage you to use a standard field instead of create a custom field.**\\n\\n### Custom Fields\\n\\nFields created to address needs unique needs:\\n- Common lead information not availalbe as a standard field (let us know so we can add it to our catalog!)\\n- Proprietary or internal tracking information\\n- Lead seller specific tracking information\\n\\nCustom fields are just as powerful as standard fields - they support all the same types and validation. Nevertheless, \\n**try to avoid using custom fields if you can**. It will make technical setup and maintenance much easier.\\n\\n#### Field Suffixes\\n\\nField suffixes are a namespacing mechanism that prevents data collision across accounts. When multiple accounts create custom fields, suffixes ensure uniqueness in naming.\\n\\n**Example scenario:**\\n- Account A adds a field called \\\"score\\\"\\n- Account B also wants a field called \\\"score\\\"\\n- Their account suffixes are: `accta` and `acctb`\\n- The field IDs are `score_accta` and `score_acctb`\\n- If Account A wants to deliver a lead to Account B, a manual mapping must be added: `score_accta` -> `score_acctb`\\n- Account A must ensure that Account B's `score` field has the same meaning. Account A's score field might represent credit score, while Account B's score field might represent lead score.\\n- The suffix prevents automatic field mapping from making mistakes. \\n\\n**Suffix Naming Rules:**\\n- 3-5 alphanumeric characters\\n- Lowercase only\\n- Must be unique across all entities\\n- Optional but recommended for entities with custom fieldsEvery custom is uniquely named across the platform. \\n\\n\\n## Field Types and Intelligence\\n\\nThe real power of fields comes from their [types](types.md). Each field has a type that determines how data is parsed, validated, and enriched:\\n\\n### Example: Phone Field\\n```\\nRaw Input: \\\"(555) 123-4567 ext 890\\\"\\n\\nParsed Result:\\n- phone_1: \\\"5551234567\\\"\\n- phone_1.area: \\\"555\\\"\\n- phone_1.exchange: \\\"123\\\"\\n- phone_1.line: \\\"4567\\\"\\n- phone_1.extension: \\\"890\\\"\\n- phone_1.valid: true\\n- phone_1.mobile: false\\n```\\n\\n## Using Fields in Flows\\n\\nFields interact with several flow components:\\n\\n### 1. Source Configuration\\nWhen configuring a source, you map vendor fields to your standard fields:\\n\\n| Vendor Sends    | Maps To       | Result                                     |\\n|-----------------|---------------|--------------------------------------------|\\n| `contact_email` | `email`       | Vendor's data fills your email field       |\\n| `primary_phone` | `phone_1`     | Vendor's data fills your phone_1 field     |\\n| `loan_amt`      | `loan_amount` | Vendor's data fills your loan_amount field |\\n\\n### 2. Validation Rules\\nFields work with [rules](rules.md) for validation:\\n- \\\"lead.email is valid\\\"\\n- \\\"lead.phone_1 is not blank\\\"\\n- \\\"lead.loan_amount is between 5000 and 100000\\\"\\n\\n### 4. Recipient Mapping\\nWhen configuring an outboudn integration, fields map to downstram system requirements:\\n\\n| Your Field  | Recipient Expects  | Result                                    |\\n|-------------|--------------------|-------------------------------------------|\\n| `email`     | `Email_Address__c` | Your email becomes their Email_Address__c |\\n| `phone_1`   | `PrimaryPhone`     | Your phone_1 becomes their PrimaryPhone   |\\n\\n## Field Namespaces\\n\\nFields exist in different namespaces depending on context. It's important to know that\\ndata collected during a lead flow does sits outside the `lead.*` namespace, which is \\nreserved for data that's submitted by the source into the flow. \\n\\n**Appended data does not require a field in the flow.** Instead, appended data is dynamic\\nand \\\"shaped\\\" as it comes back from recipient step processing.\\n\\n| Namespace    | Contains                                 | Example                        |\\n|--------------|------------------------------------------|--------------------------------|\\n| (no prefix)  | Custom fields                            | `loan_type`, `credit_score`    |\\n| `lead.*`     | All field values submitted with the lead | `lead.email`, `lead.phone_1`   |\\n| `appended.*` | Enhancement data                         | `appended.demographics.income` |\\n\\n\\n## Best Practices\\n\\n### Choosing Fields\\n\\n**Do:**\\n- Use standard fields when they fit your needs\\n- Create custom fields only when necessary\\n- Use descriptive names for custom fields\\n- Include units in field names when relevant (e.g., `loan_amount_usd`)\\n\\n**Don't:**\\n- Duplicate standard fields with custom versions\\n- Use generic names like `field1`, `custom1`\\n- Store multiple values in one field\\n- Ignore field types - use the right type for your data\\n\\n- **[Types](types.md)** - How fields parse and validate data\\n- **[Mappings](mappings.md)** - How fields transform between systems\\n- **[Rules](rules.md)** - How fields are used in business logic\\n- **[Templates](templates.md)** - How to access field values dynamically\\n\"},{\"name\":\"Changelogs\"},{\"name\":\"Events\"},{\"name\":\"Exports\"},{\"name\":\"Leads\",\"description\":\"Free accounts do not have access to Leads (https://app.leadconduit.com/leads) and will receive a 401 (Unauthorized) \\nerror when trying to access it\"},{\"name\":\"Entities\",\"description\":\"Entities are the foundation of identity in LeadConduit. They represent the \\\"who\\\" in every lead transaction - who sends leads, who receives them, and what systems are involved. Think of entities as the business cards of the LeadConduit ecosystem - they establish identity, capabilities, and relationships.\\n\\nAt their core, entities answer two fundamental questions:\\n1. **What does the entity represent?** (Identity)\\n2. **How can it integrate with LeadConduit?** (Capability)\\n3. **How am I interacting with the entity through Leadconduit?** (Relationships)\\n\\n## Why Entities Exist\\n\\n### The Identity Problem\\nLeadConduit needs to track:\\n\\n- Companies selling leads\\n- Companies buying leads  \\n- Web forms collecting leads\\n- CRM systems receiving leads\\n- Analytics platforms tracking leads\\n- Enhancement services enriching leads\\n\\nWithout a unified identity system, this becomes chaos. Entities solve this by providing a consistent way to represent any participant in the lead ecosystem.\\n\\n### The Capability Problem\\nDifferent systems have different capabilities:\\n- A web form can send leads but not receive them\\n- A CRM can receive leads but typically doesn't send them \\n- A partner company might both send and receive leads\\n- Each system supports different integration methods\\n\\nEntities encode these capabilities through their type classifications and module associations.\\n\\n### The Relationship Problem\\nBusiness relationships are complex:\\n- You might buy leads from Company A\\n- You might sell leads to Company B\\n- Company C might be both a buyer and seller\\n\\nEntities model these relationships, especially through the account entity and connection system.\\n\\n## Core Concepts\\n\\n### Entity Classification\\n\\nEvery entity has two fundamental classifications that define its role:\\n\\n**Source Classification** (Can this entity send leads?)\\n- `seller` - A company that sells leads\\n- `form` - A web form or landing page\\n- `other` - Any other type of lead source\\n- `null` - Cannot send leads\\n\\n**Recipient Classification** (Can this entity receive leads?)\\n- `buyer` - A company that purchases leads\\n- `crm` - Customer Relationship Management system\\n- `analytics` - Analytics or tracking platform (including internal scoring services)\\n- `enhancement` - Data enrichment service\\n- `esp` - Email Service Provider\\n- `other` - Any other type of recipient\\n- `null` - Cannot receive leads\\n\\nAn entity can be both a source and recipient. For example, a partner company might be classified as both `source: \\\"seller\\\"` and `recipient: \\\"buyer\\\"`.\\n\\n**Important Note**: Entities can represent both business relationships AND technical systems. For example, a company might create an entity called \\\"Scoring Service\\\" with `recipient: 'analytics'` to represent their internal scoring API. This allows them to track all requests to that service across multiple flows.\\n\\n### Entity Types by Management\\n\\n**Account Entities**\\n- Special entities representing LeadConduit account holders\\n- Enable account-to-account lead sharing\\n- Automatically created when an account is created\\n- Can form connections with other accounts\\n- Always have both source and recipient capabilities\\n\\n**Standard Entities**\\n- Pre-built by LeadConduit\\n- Represent well-known companies (that do not have an account) and well-known services/platforms\\n- Available to all accounts\\n- Cannot be modified by users\\n- Examples: Major CRMs (Salesforce, HubSpot), big lead sellers, popular form-builder services\\n\\n**Custom Entities**\\n- Created by individual accounts when there is no account entity or standard entity\\n- Represent unique business relationships\\n- Only editable by the creating account\\n- Example: Proprietary scoring system, third party data services with no built-in integration\\n\\n**Pending Entities**\\n- Temporary entities created during the connection invitation process\\n- Convert to regular entities once invitation is accepted\\n- Used to pre-configure flows before partners join\\n\\n### The Module System\\n\\nModules are capability declarations that define HOW an entity can technically communicate. A `module_id` is a unique identifier for a specific integration (e.g., \\\"Create Salesforce Lead\\\", \\\"Send to HubSpot Contact\\\", \\\"LendingTree Ping Post\\\"). Each entity has a `module_ids` array that acts as both a capability list and a constraint system.\\n\\n**How Module Constraints Work**:\\n- When `module_ids` is non-empty, the entity can ONLY be configured with those specific integrations\\n- When adding the entity to a flow, users can only select from the supported modules\\n- This prevents configuration errors and ensures compatibility\\n\\n**Real-World Example - LendingTree Entity**:\\nLendingTree has proprietary lead submission requirements that only work with specific integrations. Their entity's `module_ids` array contains only the modules that support their format:\\n```json\\n{\\n  \\\"name\\\": \\\"LendingTree\\\",\\n  \\\"module_ids\\\": [\\n    \\\"leadconduit-lendingtree.inbound.post\\\",\\n    \\\"leadconduit-lendingtree.inbound.ping_post\\\"\\n  ]\\n}\\n```\\n\\nFor example, adding LendingTree as a flow source, only allows configuration of LendingTree-specific integration module IDs. This eliminates the possibility of trying to use a generic HTTP module that wouldn't understand LendingTree's proprietary format.\\n\\n**Module Types**:\\n- **Standard Integration**: Basic HTTP communication (`leadconduit-default.inbound/outbound`)\\n- **Third-Party Integrations**: Vendor-specific integrations (`leadconduit-salesforce.outbound`)  \\n- **Generic Integration**: Format-specific implementations (`leadconduit-custom.outbound.json`)\\n- **Internal Platform Integrations**: LeadConduit-to-LeadConduit (`leadconduit-integration-leadconduit.outbound.to_buyer`)\\n\\n**Empty vs Non-Empty Arrays**:\\n- Empty `module_ids`: Entity can use any available integration module\\n- Non-empty `module_ids`: Entity is restricted to only those specific modules\\n\\n### The Reverse Integration Pattern\\n\\nOne of LeadConduit's most powerful features is how it handles vendor-specific integrations through entities. This flips the traditional integration model on its head.\\n\\n**Traditional Lead Industry Model:**\\n- Buyer publishes submission specifications\\n- Every seller must implement the buyer's API\\n- Sellers do custom development for each buyer\\n- Technical burden is on the seller\\n\\n**LeadConduit's Entity-Based Model:**\\n- Major vendors have custom integration modules\\n- These modules are associated with the vendor's entity\\n- Buyers simply select the vendor's entity as a source\\n- LeadConduit handles all the technical complexity\\n\\n**Real-World Example:**\\nA major lead vendor requires:\\n- Proprietary authentication scheme\\n- Custom data format with specific field names\\n- Special validation rules\\n- Unique error handling\\n\\nInstead of every buyer implementing this vendor's requirements:\\n1. The vendor gets a LeadConduit account (creating an account entity)\\n2. Their custom integration module is associated with their account entity\\n3. Any buyer can now receive leads from them by adding that entity as a source\\n4. The buyer selects the vendor's entity, and LeadConduit automatically uses the correct integration\\n\\nThis approach is particularly valuable because:\\n- Large vendors often have the market power to dictate technical requirements\\n- They want to make it easy for buyers to work with them\\n- Buyers don't need technical resources to integrate with complex vendors\\n- Integration happens once, benefits everyone\\n\\n**The Shift to Account Entities:**\\nLeadConduit is moving away from standard entities in favor of requiring all participants to have accounts. This means:\\n- Every major vendor will have their own account entity\\n- Custom integrations are attached to these account entities\\n- Better accountability and relationship tracking\\n- More flexibility for vendors to manage their own integration requirements\\n\\n### Connection System\\n\\nFor account entities (representing other LeadConduit accounts), the connection system tracks business relationships:\\n\\n**Connection Types**\\n- `seller`: They sell leads to you\\n- `buyer`: They buy leads from you\\n- `both`: Bidirectional relationship\\n- `null`: No active connection\\n\\nConnections enable:\\n- Simplified account-to-account lead sharing\\n- Relationship visibility in the UI\\n- Access control for lead flow\\n- Business relationship tracking\\n\\n## Entity Lifecycle\\n\\n### Creation\\nWhen an entity is created, it establishes:\\n1. **Identity**: Name, description, logo, website\\n2. **Classification**: What type of source/recipient\\n3. **Capabilities**: Which modules it supports\\n4. **Ownership**: Which account owns it (for custom entities)\\n\\n### Usage\\nEntities are used in flows by:\\n1. **Adding as a source**: Defines where leads come from\\n2. **Adding as a recipient**: Defines where leads go\\n3. **Configuring integration**: Using the entity's supported modules\\n4. **Applying business rules**: Based on the entity relationship\\n\\n### Updates\\nWhen entities are updated:\\n1. Changes propagate to all flows using the entity\\n2. Historical data maintains the entity reference\\n3. Active flows automatically use new entity metadata\\n4. No disruption to lead processing\\n\\n### Deprecation\\nInstead of deletion, entities can be deprecated:\\n1. Marked with a deprecation flag\\n2. Can reference a replacement entity\\n3. Existing usage continues to work\\n4. New usage is discouraged or prevented\\n\\n## Special Entity Behaviors\\n\\n### Enhancement Recipients\\nEnhancement services (data append, verification, etc.) are special:\\n- They receive lead data for processing\\n- They don't consume leads like buyers do\\n- They're excluded from certain account relationship tracking\\n- They typically return enriched data back to the flow\\n\\n### Account Entity Auto-Creation\\nWhen a LeadConduit account is created:\\n1. An entity is automatically created with the same ID\\n2. It's marked as both source and recipient\\n3. It gets standard B2B communication modules\\n4. It represents that account in the entity ecosystem\\n\\n### Module Inheritance\\nEntities inherit certain behaviors from their modules:\\n- Authentication requirements\\n- Configuration options\\n- Data format expectations\\n- Integration-specific features\\n\\n## Business Implications\\n\\n### For Lead Buyers\\nEntities representing buyers:\\n- Track which companies purchase your leads\\n- Enable consistent delivery configuration\\n- Maintain delivery history\\n- Support buyer-specific customization\\n\\nMore importantly for buyers receiving leads:\\n- **No custom development needed** for complex vendors\\n- **Automatic integration** with major lead sources\\n- **Reduced technical burden** - just select the vendor's entity\\n- **Faster onboarding** with new lead sources\\n- **Consistent experience** across all vendors\\n\\n### For Lead Sellers  \\nEntities representing sellers:\\n- Identify lead sources clearly\\n- Enable source-specific validation\\n- Track source quality metrics\\n- Support seller-specific pricing\\n\\nFor major vendors with custom requirements:\\n- **Control their integration** specifications\\n- **Implement once** for all buyers on LeadConduit\\n- **Reduce buyer friction** by eliminating technical barriers\\n- **Maintain standards** while being easy to work with\\n- **Scale distribution** without buyer-by-buyer integrations\\n\\n### For Integrations\\nEntities representing systems:\\n- Standardize integration configuration\\n- Enable reuse across flows\\n- Maintain consistent behavior\\n- Simplify credential management\\n\\n**Key distinction**: While entities enable configuration reuse across flows, each flow must still be independently configured to connect to the service. The entity provides:\\n- **Identity tracking** - Know which flows use the service\\n- **Usage analytics** - Track requests across all flows\\n- **Consistent naming** - Same entity name in all flows\\n- **Classification** - Properly categorize the service type\\n\\nFor example, a \\\"Scoring Service\\\" entity:\\n- Represents your internal lead scoring API\\n- Used in multiple flows for consistency\\n- Each flow independently configures the API endpoint and credentials\\n- Allows tracking all scoring requests across your account\\n\\nThe reverse integration pattern means:\\n- **Vendors define requirements** instead of conforming to each buyer\\n- **LeadConduit implements** the vendor's specifications\\n- **Buyers benefit** without doing any integration work\\n- **Market power** translates to technical convenience\\n\\n### For Partner Relationships\\nAccount entities enable:\\n- Direct account-to-account lead sharing\\n- Trusted business relationships\\n- Simplified technical integration\\n- Relationship visibility\\n- Custom integration attachment\\n\\n## Common Patterns\\n\\n### Multi-Role Entities\\nMany entities serve multiple roles:\\n```\\nPartner Company ABC\\n├── As a seller: Sends leads to you\\n├── As a buyer: Receives leads from you\\n└── As an account: Has their own LeadConduit instance\\n```\\n\\n### Technical Service Entities\\nEntities often represent internal technical services:\\n```\\nInternal Services\\n├── Scoring Service (analytics recipient)\\n├── Data Validation API (enhancement recipient)\\n├── Lead Router (other recipient)\\n└── Internal CRM (crm recipient)\\n```\\n\\nEach service entity:\\n- Has consistent naming across flows\\n- Enables tracking of all requests\\n- Requires independent configuration per flow\\n- Groups related technical integrations\\n\\n### Integration Patterns\\nEntities often follow integration patterns:\\n```\\nCRM Integration Pattern:\\n├── Standard CRM Entity (e.g., Salesforce)\\n├── Multiple flows use the same entity\\n├── Each flow configures differently\\n└── All share core CRM capabilities\\n```\\n\\n## Best Practices\\n\\n### Naming Conventions\\n- Use clear, recognizable names\\n- Include company/system name\\n- Avoid generic names like \\\"CRM\\\" or \\\"Buyer\\\"\\n- Consider future growth (avoid \\\"Test\\\" or \\\"Temp\\\")\\n\\n### Classification Selection\\n- Choose the most specific type available\\n- Use \\\"other\\\" only when no specific type fits\\n- Consider primary business relationship\\n- Don't force-fit wrong classifications\\n\\n### Module Selection\\n- Only include actually supported modules\\n- Don't add modules \\\"just in case\\\"\\n- Consider authentication requirements\\n- Match modules to business needs\\n\\n### Relationship Management\\n- Use standard entities when available\\n- Create custom entities for unique relationships\\n- Leverage account entities for B2B partnerships\\n- Document special configurations in description\\n\\n## Common Misconceptions\\n\\n### \\\"Entities are just labels\\\"\\nReality: Entities carry configuration, capabilities, and relationship data. They're active participants in lead flow, not passive labels.\\n\\n### \\\"I need a new entity for each flow\\\"\\nReality: Entities should be reused across flows. Create once, use many times.\\n\\n### \\\"Standard entities can't be customized\\\"\\nReality: While you can't change standard entities, you can configure their integrations, acceptance criteria, volume caps, pricing, etc differently in each flow.\\n\\n### \\\"Account entities are complicated\\\"\\nReality: Account entities simply represent another account on the platform. Each account only has one account entity, platform wide.\\n\\n## Key Takeaways\\n\\n1. **Entities are Identity**: They establish who participates in lead transactions\\n2. **Classification Drives Behavior**: Source and recipient types determine capabilities\\n3. **Modules Define Integration**: The technical \\\"how\\\" of lead movement\\n4. **Reverse Integration is Powerful**: Vendors define specs, LeadConduit implements, buyers benefit automatically\\n5. **Account Entities are the Future**: Moving away from standard entities to account-based participation\\n6. **Relationships Matter**: Especially for account-to-account lead sharing\\n7. **Reuse is Key**: Create entities once, use across multiple flows\\n8. **Custom Integrations Attach to Entities**: Major vendors get their own integration modules\\n9. **Dual Purpose**: Entities can represent both business relationships AND technical services\"},{\"name\":\"Firehose\",\"description\":\"# Firehose Multi-Service Configuration\\n\\n## Overview\\n\\nEach flow is separately configured to use the firehose. This API allows firehose configuration to be tested before it \\nis set on a flow.\\n\\nThe Firehose feature supports multiple cloud storage services for event data export. This document describes the configuration options for both AWS S3 and Azure Blob Storage services.\\n\\n## Configuration Structure\\n\\n### Legacy Configuration (Backward Compatible)\\n\\nFor existing flows, the legacy configuration continues to work:\\n\\n```json\\n{\\n  \\\"firehose\\\": {\\n    \\\"enabled\\\": true,\\n    \\\"credential_id\\\": \\\"507f1f77bcf86cd799439011\\\",\\n    \\\"bucket\\\": \\\"my-s3-bucket\\\",\\n    \\\"prefix\\\": \\\"events/production\\\"\\n  }\\n}\\n```\\n\\n### New Service-Based Configuration\\n\\nThe new service-based configuration allows multiple cloud storage providers:\\n\\n```json\\n{\\n  \\\"firehose\\\": {\\n    \\\"enabled\\\": true,\\n    \\\"services\\\": {\\n      \\\"aws\\\": {\\n        \\\"enabled\\\": true,\\n        \\\"credential_id\\\": \\\"507f1f77bcf86cd799439011\\\",\\n        \\\"bucket\\\": \\\"my-s3-bucket\\\",\\n        \\\"prefix\\\": \\\"events/aws\\\"\\n      },\\n      \\\"azure\\\": {\\n        \\\"enabled\\\": true,\\n        \\\"credential_id\\\": \\\"507f1f77bcf86cd799439012\\\", \\n        \\\"bucket\\\": \\\"my-azure-container\\\",\\n        \\\"prefix\\\": \\\"events/azure\\\"\\n      }\\n    }\\n  }\\n}\\n```\\n\\n## Credential Validation\\n\\n### AWS S3 Validation\\n\\nThe `/firehose` endpoint validates AWS credentials by:\\n\\n1. Creating a test file with unique name: `leadconduit_verification_[flow_id_]YYYYMMDDHHMMSSMS.txt`\\n2. Uploading it to the specified bucket (with optional prefix) when `verification_file=true` (default)\\n3. Alternatively, validating bucket access without creating file when `verification_file=false`\\n4. Returning the S3 response with ETag or validation confirmation\\n\\n**Example Requests:**\\n\\n*Basic validation (creates file):*\\n```bash\\ncurl -X GET \\\"https://app.leadconduit.com/firehose?service=aws&access_key_id=AKIA...&secret_access_key=wJal...&bucket=my-bucket&prefix=test\\\"\\n```\\n\\n*With flow ID (includes flow identifier in filename):*\\n```bash\\ncurl -X GET \\\"https://app.leadconduit.com/firehose?service=aws&access_key_id=AKIA...&secret_access_key=wJal...&bucket=my-bucket&flow_id=507f1f77bcf86cd799439011\\\"\\n```\\n\\n*Validation only (no file created):*\\n```bash\\ncurl -X GET \\\"https://app.leadconduit.com/firehose?service=aws&access_key_id=AKIA...&secret_access_key=wJal...&bucket=my-bucket&verification_file=false\\\"\\n```\\n\\n**Example Responses:**\\n\\n*File created:*\\n```json\\n{\\n  \\\"validated\\\": true,\\n  \\\"verification_file\\\": true\\n}\\n```\\n\\n*Validation only:*\\n```json\\n{\\n  \\\"validated\\\": true,\\n  \\\"verification_file\\\": false\\n}\\n```\\n\\n### Azure Blob Storage Validation\\n\\nThe `/firehose` endpoint validates Azure credentials by:\\n\\n1. Creating a BlobServiceClient from the connection string\\n2. Checking if the specified container exists and is accessible\\n3. Optionally creating verification file based on `verification_file` parameter\\n4. Returning container validation information\\n\\n**Example Request:**\\n```bash\\ncurl -X GET \\\"https://app.leadconduit.com/firehose?service=azure&connection_string=DefaultEndpointsProtocol=https;AccountName=test;AccountKey=key;EndpointSuffix=core.windows.net&bucket=my-container\\\"\\n```\\n\\n**Example Responses:**\\n\\n*With verification file:*\\n```json\\n{\\n  \\\"validated\\\": true,\\n  \\\"verification_file\\\": true\\n}\\n```\\n\\n*Validation only (verification_file=false):*\\n```json\\n{\\n  \\\"validated\\\": true,\\n  \\\"verification_file\\\": false\\n}\\n```\\n\\n## Event Processing\\n\\n### Single Service Configuration\\n\\nWhen only one service is configured, events are sent to that service. If the service fails, events are spooled for retry.\\n\\n### Multi-Service Configuration\\n\\nWhen multiple services are configured:\\n\\n1. Each enabled service receives the event independently\\n2. If a service fails, it generates its own spool message for retry\\n3. Each service can have different bucket/container and prefix configurations\\n\\n### Spooling and Retry\\n\\n- Each service failure generates a separate SQS message for retry\\n- Spooled events contain service-specific metadata (bucket, prefix, credentials)\\n- The unspooler processes each service's failed events independently\\n- File-based spooling creates separate paths for each service configuration\\n\\n## Migration Guide\\n\\n### From Legacy to Service-Based Configuration\\n\\n1. **Keep existing configuration**: Legacy configuration continues to work\\n2. **Add services object**: Gradually migrate to service-based configuration\\n3. **Test thoroughly**: Validate both configurations work as expected\\n\\nExample migration:\\n\\n**Before:**\\n```json\\n{\\n  \\\"firehose\\\": {\\n    \\\"enabled\\\": true,\\n    \\\"credential_id\\\": \\\"507f1f77bcf86cd799439011\\\",\\n    \\\"bucket\\\": \\\"my-bucket\\\"\\n  }\\n}\\n```\\n\\n**After:**\\n```json\\n{\\n  \\\"firehose\\\": {\\n    \\\"enabled\\\": true,\\n    \\\"services\\\": {\\n      \\\"aws\\\": {\\n        \\\"enabled\\\": true,\\n        \\\"credential_id\\\": \\\"507f1f77bcf86cd799439011\\\",\\n        \\\"bucket\\\": \\\"my-bucket\\\"\\n      }\\n    }\\n  }\\n}\\n```\"},{\"name\":\"Account\",\"description\":\"The authenticated user reveals the details of the API caller's user account as well as certain details about\\nthe account of which the user is member. The `products` array reveals all ActiveProspect products and to which the\\ncaller's account is subscribed.\\n\"},{\"name\":\"Connections\",\"description\":\"Account connections with other LC accounts\"},{\"name\":\"System\"},{\"name\":\"Changelogs\",\"description\":\"A changelog represents a creation, update, or deletion of a model such as\\n`Flow`, `Entity`, or `Field`. Every change made will log the exact\\ndifference between the previous revision and the current one, as well as\\nwhat user was logged in and what account the change was made on.\\nContained within the changelog is the full revision of the model changed\\nat the state after the change was applied, as well as the differences\\nbetween the previous revision and current revision.\\n\"},{\"name\":\"Credentials\",\"description\":\"A credential is used by LeadConduit's rich integrations to authenticate\\nwith third party platforms. Once a credential is established, it can be\\nused across flows. A credential ID can be specified on a source in a flow\\nor in recipient step's integration mappings.\\n\"},{\"name\":\"Reports\",\"description\":\"\"},{\"name\":\"Routers\",\"description\":\"\"},{\"name\":\"Types\",\"x-traitTag\":true,\"description\":\"- [Overview](#overview)\\n- [Why Types Exist](#why-types-exist)\\n- [Core Concepts](#core-concepts)\\n- [Quick Reference](#quick-reference)\\n- [Complete Type Catalog](#complete-type-catalog)\\n  - [Contact Types](#contact-types)\\n  - [Personal Data Types](#personal-data-types)\\n  - [Location Types](#location-types)\\n  - [Data Types](#data-types)\\n  - [Specialized Types](#specialized-types)\\n- [How Types Work in Practice](#how-types-work-in-practice)\\n- [Special Type Behaviors](#special-type-behaviors)\\n- [Type Selection Guide](#type-selection-guide)\\n- [Common Patterns](#common-patterns)\\n- [Integration with LeadConduit](#integration-with-leadconduit)\\n\\n## Overview\\n\\nTypes are the data standardization engine of LeadConduit. They transform the messy, inconsistent data that arrives from various sources into clean, structured, and predictable formats that systems can reliably process. Think of types as intelligent parsers that not only validate data but also extract meaningful components and metadata.\\n\\nAt their core, types solve three fundamental problems:\\n1. **Data Chaos**: Lead data arrives in countless formats\\n2. **Validation Confusion**: What makes data \\\"valid\\\" varies by context\\n3. **Component Extraction**: Valuable data is often buried within strings\\n\\n## How Types Work\\n\\n### The Problems Types Solve\\n\\n**Format Chaos**: Lead data comes from everywhere with different formats - phone numbers as \\\"(512) 789-1111\\\" vs \\\"512-789-1111\\\" vs \\\"5127891111\\\", states as \\\"TX\\\" vs \\\"Texas\\\" vs \\\"tx\\\". This creates chaos both **inbound** (accepting leads) and **outbound** (delivering to external systems).\\n\\n**Validation Dilemma**: Traditional systems reject misformatted data, but in lead distribution you can't control input formats, rejecting leads means lost revenue, and different buyers have different requirements.\\n\\n**Hidden Value**: Valuable data is embedded within strings (area codes, domains, ZIP codes, age from DOB) requiring complex string manipulation to extract.\\n\\n### How Types Solve These Problems\\n\\n**Parse-Normalize-Use Pattern**: Every type follows three steps: **Parse** (accept various formats), **Normalize** (convert to consistent format), **Use** (access standardized data and components in flows).\\n\\nExample: `\\\"(512) 789-1111\\\"` → `{ raw: \\\"(512) 789-1111\\\", normal: \\\"5127891111\\\", area: \\\"512\\\", exchange: \\\"789\\\", line: \\\"1111\\\", valid: true }`\\n\\n**Normalization Benefits**:\\n- **Simplified Rules**: Write one rule for `State equals \\\"TX\\\"` instead of separate rules for `\\\"tx\\\"`, `\\\"texas\\\"`, `\\\"Texas\\\"`, etc.\\n- **Effortless Outbound Delivery**: Send normalized data to external systems often without format conversion\\n- **Consistent Storage**: All data stored in predictable formats\\n\\n**Component Extraction**: Types automatically extract valuable components without string manipulation:\\n- **Phone**: Area code, exchange, line, extension, type, toll-free status\\n- **Email**: User, domain, host, TLD, free/disposable detection\\n- **Postal Code**: ZIP, country, regional components\\n\\n**Graceful Validation**: The `valid` component marks data quality without stopping processing. Invalid data doesn't break flows - it's marked for you to handle as needed. Use `Phone 1 > Valid is true` in rules to filter based on data quality.\\n\\n**Raw Value Preservation**: Every type preserves the original input as `raw` for audit trails, troubleshooting, and integration flexibility.\\n\\n**Privacy-Focused Analytics**: Types support aggregation for reporting while excluding sensitive information (usernames from emails, line numbers from phones).\\n\\n## Quick Reference\\n\\n| Type                                         | Primary Use             | Key Components                                       | Common Field Examples             |\\n|----------------------------------------------|-------------------------|------------------------------------------------------|-----------------------------------|\\n| **[Phone](#phone-type)**                     | Contact numbers         | area, exchange, line, type, is_tollfree              | Phone 1, Mobile Phone, Work Phone |\\n| **[Email](#email-type)**                     | Contact emails          | domain, user, host, is_free, is_disposable           | Email, Work Email, Co-Borrower Email |\\n| **[String](#string-type)**                   | General text            | none                                                 | Comments, Description, Custom fields |\\n| **[Number](#number-type)**                   | Numeric data            | none                                                 | Loan Amount, Income, Credit Score |\\n| **[Boolean](#boolean-type)**                 | Yes/no values           | none                                                 | Opt In, Has Insurance, Accept Terms |\\n| **[Date](#date-type)**                       | Date values             | none                                                 | Application Date, Move Date       |\\n| **[DOB](#dob-type-date-of-birth)**           | Birth dates (masked)    | age, year (processing only)                          | DOB, Co-Borrower DOB              |\\n| **[State](#state-type)**                     | US states/provinces     | name                                                 | State, Property State             |\\n| **[Postal Code](#postal-code-type)**         | ZIP/postal codes        | zip, country_code, fsa, outcode                      | Postal Code, Property Postal Code |\\n| **[SSN](#ssn-type-social-security-number)**  | Social Security (masked) | first_three, middle_two, last_four (processing only) | Social Security Number            |\\n| **[First Name](#first-name-type)**           | Given names             | none                                                 | First Name, Co-Borrower First Name |\\n| **[Last Name](#last-name-type)**             | Family names            | none                                                 | Last Name, Co-Borrower Last Name  |\\n| **[City](#city-type)**                       | City names              | none                                                 | City, Property City               |\\n| **[Street](#street-type)**                   | Street addresses        | number, name                                         | Address 1, Property Address       |\\n| **[Gender](#gender-type)**                   | Gender values           | abbr                                                 | Gender, Applicant Gender          |\\n| **[Range](#range-type)**                     | Numeric ranges          | min, max, mid, average                               | Age Range, Income Range           |\\n| **[Time](#time-type)**                       | Date/time values        | none                                                 | Submission Time, Appointment Time |\\n| **[URL](#url-type)**                         | Web addresses           | protocol, host, path, query                          | Landing Page URL, Referrer URL    |\\n| **[Credential](#credential-type)**           | Passwords/keys (masked) | none                                                 | API Secret, Password              |\\n| **[IP](#ip-type)**                           | IP addresses            | is_ipv4, ipv6_format                                 | IP Address, Source IP             |\\n| **[TrustedForm URL](#trustedform-url-type)** | TrustedForm certificates | certificate_id, type, is_web                         | TrustedForm Certificate URL       |\\n\\n## Complete Type Catalog\\n\\n### Contact Types\\n\\n#### Phone Type\\n\\nComprehensive phone number parsing and validation for US/Canada numbers with real-world verification.\\n\\n**Geographic Limitation**: Currently only supports US and Canadian phone numbers. International numbers from other countries will be marked as invalid (valid: false) and will not parse correctly, even if they have a valid format in their home country.\\n\\n**Advanced Validation**: The `valid` property indicates more than just format correctness - it verifies:\\n- The area code is a real, assigned area code\\n- The exchange is a real exchange within that area code\\n- The area code and exchange legitimately belong together\\n- The number follows valid North American Numbering Plan rules\\n\\nThis means a phone number like \\\"(999) 555-1234\\\" would be invalid even though the format is correct, because 999 is not a real area code.\\n\\n**What It Does NOT Verify**: The validation does NOT check if:\\n- The complete 10-digit number is actually connected/in service\\n- The line (last 4 digits) is valid for that area code and exchange\\n- The number can receive calls or texts\\n\\nA number can pass type validation but still be disconnected or undeliverable.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Area: Area code\\n- Exchange: Exchange code\\n- Line: Line number\\n- Number: Full normalized number\\n- Extension: Extension if present\\n- Country Code: Two-letter country code\\n- Country Calling Code: Numeric country calling code\\n- Type: Number type (home/work/mobile)\\n- Is Tollfree: Boolean for toll-free numbers\\n\\n**Type Hints:** Append `h` (home), `w` (work), `m` (mobile), or `c` (cell) to set type\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nValid US Numbers (real area codes and exchanges):\\n\\\"(512) 789-1111\\\" → area: \\\"512\\\", exchange: \\\"789\\\", line: \\\"1111\\\"\\n\\\"512-789-1111\\\" → \\\"5127891111\\\"\\n\\\"512.789.1111\\\" → \\\"5127891111\\\"\\n\\nInvalid Despite Good Format (fake area code):\\n\\\"(999) 555-1234\\\" → valid: false (999 not a real area code)\\n\\\"(123) 456-7890\\\" → valid: false (123 not a real area code)\\n\\nWith Extensions:\\n\\\"5127891111x123\\\" → extension: \\\"123\\\"\\n\\\"5127891111 x 43\\\" → extension: \\\"43\\\"\\n\\nToll-Free:\\n\\\"8775551212\\\" → is_tollfree: true\\n\\\"1-800-555-1212\\\" → is_tollfree: true\\n\\nWith Type Hints:\\n\\\"5127891111m\\\" → type: \\\"mobile\\\"\\n\\\"5127891111h\\\" → type: \\\"home\\\"\\n\\nMasked Numbers:\\n\\\"1-(512) *** ****\\\" → valid: true (masked)\\n\\\"**********\\\" → valid: true (fully masked)\\n\\nInternational (will NOT parse correctly):\\n\\\"+49 30 22610\\\" → valid: false (not US/Canadian format)\\n\\\"+44 1484 519892\\\" → valid: false (not US/Canadian format)\\nNote: International numbers are not supported unless they coincidentally match US/Canadian patterns\\n```\\n\\n**Invalid inputs** (valid=false): \\n- `\\\"donkey kong\\\"` (not a number)\\n- `\\\"964523331\\\"` (too short)\\n- `\\\"(999) 555-1234\\\"` (invalid area code)\\n- `\\\"(512) 999-1111\\\"` (invalid exchange for 512 area code)\\n\\n**Field Examples:** Phone 1, Phone 2, Mobile Phone, Work Phone\\n\\n**Common Component Usage:**\\n- Check for specific area codes: `Phone 1 > Area equals \\\"512\\\"`\\n- Identify toll-free numbers: `Phone 1 > Is Tollfree is true`\\n- Format for display: `{{Phone 1 > Area}}-{{Phone 1 > Exchange}}-{{Phone 1 > Line}}`\\n- Check validity: `Phone 1 > Valid is true`\\n\\n**Important Limitation**: The `valid` property only confirms the area code and exchange are legitimate - it does NOT verify the full number is connected or deliverable. The \\\"line\\\" portion (last 4 digits) could still be invalid or disconnected. For true deliverability verification, use third-party Add-On services like Trestle, Telesign, or BriteVerify in a flow step to collect carrier-level metadata, then evaluate the appended data in a subsequent filter step to block disconnected numbers.\\n\\n---\\n\\n#### Email Type\\n\\nComprehensive email parsing with domain analysis and validation.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- User: Username (before @)\\n- Domain: Full domain (after @)\\n- Host: Domain without TLD\\n- TLD: Top-level domain\\n- Is Free: Boolean for free email providers\\n- Is Disposable: Boolean for temporary emails\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\nStandard:\\n\\\"user@domain.com\\\" → user: \\\"user\\\", domain: \\\"domain.com\\\"\\n\\\"John.Doe@Gmail.com\\\" → \\\"john.doe@gmail.com\\\" (auto-lowercased)\\n\\nPlus Addressing:\\n\\\"user+tag@domain.com\\\" → user: \\\"user+tag\\\"\\n\\\"test+hola@domain.com\\\" → valid: true\\n\\nWith Spaces:\\n\\\"  user@domain.com  \\\" → \\\"user@domain.com\\\" (trimmed)\\n\\\"p. j. butter@gmail.com\\\" → valid: true\\n\\nFree Email Detection:\\n\\\"user@gmail.com\\\" → is_free: true\\n\\\"user@yahoo.com\\\" → is_free: true\\n\\\"user@company.com\\\" → is_free: false\\n\\nDisposable Detection:\\n\\\"user@mailinator.com\\\" → is_disposable: true\\n\\\"user@10minutemail.com\\\" → is_disposable: true\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"Asdf\\\"` (no @), `\\\"hello@//gmail.xn--om.3ia\\\"`\\n\\n**Field Examples:** Email, Work Email, Co-Borrower Email\\n\\n**Common Component Usage:**\\n- Check if email is from a specific domain: `Email > Domain equals \\\"company.com\\\"`\\n- Identify free email providers: `Email > Is Free is true`\\n- Extract username for display: `{{Email > User}}`\\n\\n---\\n\\n### Personal Data Types\\n\\n#### First Name Type\\n\\nSimple string type for given names with basic validation.\\n\\n**Components:**\\n- Raw: Unmodified value\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\n\\\"John\\\" → \\\"John\\\"\\n\\\"Mary-Jane\\\" → \\\"Mary-Jane\\\"\\n\\\"José\\\" → \\\"José\\\"\\n\\\"  Alice  \\\" → \\\"Alice\\\"  // Whitespace trimmed\\n```\\n\\n**Field Examples:** First Name, Co-Borrower First Name\\n\\n---\\n\\n#### Last Name Type\\n\\nSimple string type for family names with basic validation.\\n\\n**Components:**\\n- Raw: Unmodified value\\n\\n**Operators:** Same as First Name type\\n\\n**Examples:**\\n```\\n\\\"Smith\\\" → \\\"Smith\\\"\\n\\\"O'Brien\\\" → \\\"O'Brien\\\"\\n\\\"García-López\\\" → \\\"García-López\\\"\\n```\\n\\n**Field Examples:** Last Name, Co-Borrower Last Name\\n\\n---\\n\\n#### DOB Type (Date of Birth)\\n\\nSpecial date type that adds age calculation and is maskable for privacy.\\n\\n**Components:**\\n- Raw: The full date (only accessible during processing)\\n- Age: The age as of today (only accessible during processing)\\n- Year: The year from the DOB (only accessible during processing)\\n\\n**Maskable:** Yes\\n\\n**Operators:** Same as Date type\\n\\n**Examples:**\\n```\\nDuring processing:\\n\\\"1990-01-15\\\" → {\\n  raw: \\\"1990-01-15\\\",\\n  age: 34.9,\\n  year: 1990,\\n  valid: true\\n}\\n\\nAfter processing (stored as): \\\"****-**-**\\\"\\nNo components accessible - all values masked\\n```\\n\\n**Field Examples:** DOB, Mortgage Co-Borrower DOB, Spouse DOB\\n\\n---\\n\\n#### Gender Type\\n\\nParses gender values with abbreviation support.\\n\\n**Valid Inputs:**\\n- Male: `m`, `male`, `M`, `Male`, `MALE` (case insensitive)\\n- Female: `f`, `female`, `F`, `Female`, `FEMALE` (case insensitive)\\n- Other: `o`, `other`, `O`, `Other`, `OTHER` (case insensitive)\\n- With whitespace: `\\\"  m  \\\"` → male\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Abbreviation: Abbreviated form (M, F, O)\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n\\n**Examples:**\\n```\\n\\\"male\\\" → {               \\\"f\\\" → {\\n  normal: \\\"male\\\",           normal: \\\"female\\\",\\n  raw: \\\"male\\\",              raw: \\\"f\\\",\\n  abbr: \\\"M\\\",                abbr: \\\"F\\\",\\n  valid: true               valid: true\\n}                         }\\n\\n\\\"MALE\\\" → \\\"male\\\"         \\\"other\\\" → abbr: \\\"O\\\"\\n\\\"  m  \\\" → \\\"male\\\"        \\\"O\\\" → \\\"other\\\"\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"50\\\"`, `\\\"asdf\\\"`, `5`, `true`\\n\\n**Field Examples:** Gender, Applicant Gender\\n\\n---\\n\\n#### SSN Type (Social Security Number)\\n\\nUS Social Security Number parsing with masking for privacy.\\n\\n**Components:**\\n- Raw: Unmodified value (only accessible during processing)\\n- First Three: First three digits (only accessible during processing)\\n- Middle Two: Middle two digits (only accessible during processing)\\n- Last Four: Last four digits (only accessible during processing)\\n\\n**Maskable:** Yes\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nDuring processing:\\n\\\"123456789\\\" → first_three: \\\"123\\\", middle_two: \\\"45\\\", last_four: \\\"6789\\\"\\n\\\"123-45-6789\\\" → \\\"123456789\\\" (dashes removed)\\n\\\"123 45 6789\\\" → \\\"123456789\\\" (spaces removed)\\n\\\"123.45.6789\\\" → \\\"123456789\\\" (dots removed)\\n\\\"  123-45-6789  \\\" → \\\"123456789\\\" (trimmed)\\n\\\"donkey 123456789\\\" → \\\"123456789\\\" (text ignored)\\n\\nAfter processing (stored as): \\\"*********\\\"\\nNo components accessible - all values masked\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"abcd\\\"`, `\\\"\\\"`, `\\\"   \\\"`\\n\\n**Field Examples:** Social Security Number\\n\\n**Common Component Usage (During Processing Only):**\\n- Check last four digits: `Social Security Number > Last Four equals \\\"1234\\\"`\\n- Send to integration: `{{Social Security Number > Last Four}}`\\n- Check if provided: `Social Security Number > Valid is true`\\n\\n**Note:** After processing completes, these components are NOT available\\n\\n---\\n\\n### Location Types\\n\\n#### Street Type\\n\\nStreet address parsing with number and name extraction.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Number: Street number\\n- Name: Street name\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\n\\\"123 Main Street\\\" → number: \\\"123\\\", name: \\\"Main Street\\\"\\n\\\"4203 Guadalupe St\\\" → number: \\\"4203\\\", name: \\\"Guadalupe St\\\"\\n\\\"  123 Main St  \\\" → \\\"123 Main St\\\" (trimmed)\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"Main Street\\\"` (no number), `\\\"Asdf\\\"`\\n\\n**Field Examples:** Address 1, Property Address\\n\\n---\\n\\n#### City Type\\n\\nSimple string type for city names with no format validation.\\n\\n**Components:**\\n- Raw: Unmodified value\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\n\\\"Austin\\\" → \\\"Austin\\\"\\n\\\"Dallas\\\" → \\\"Dallas\\\"\\n\\\"San Francisco\\\" → \\\"San Francisco\\\"\\n\\\"  Chicago  \\\" → \\\"Chicago\\\"  // Whitespace trimmed\\n```\\n\\n**Field Examples:** City, Property City, Employer City\\n\\n---\\n\\n#### State Type\\n\\nUS states and Canadian provinces with abbreviation normalization.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Name: Full state/province name\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nUS States:\\n\\\"TX\\\" → name: \\\"Texas\\\"\\n\\\"tx\\\" → \\\"TX\\\" (auto-uppercased)\\n\\\"Texas\\\" → \\\"TX\\\"\\n\\\"texas\\\" → \\\"TX\\\"\\n\\nCanadian Provinces:\\n\\\"ON\\\" → name: \\\"Ontario\\\"\\n\\\"Quebec\\\" → \\\"QC\\\", name: \\\"Quebec\\\"\\n\\nUnknown Values (still valid=true):\\n\\\"DX\\\" → \\\"DX\\\" (unknown but preserved)\\n\\\"Dexus\\\" → \\\"Dexus\\\"\\n\\\"DEXUS NEXUS\\\" → \\\"DEXUS NEXUS\\\"\\n```\\n\\n**Field Examples:** State, Property State, License State\\n\\n---\\n\\n#### Postal Code Type\\n\\nMulti-country postal code parsing supporting US, Canada, and UK formats.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Country Code: Country abbreviation\\n- **US Components:**\\n  - ZIP: First 5 digits\\n  - Four: Last 4 digits (ZIP+4)\\n- **Canadian Components:**\\n  - FSA: Forward sortation area\\n  - LDU: Local delivery unit\\n- **UK Components:**\\n  - Outcode: Outward code\\n  - Incode: Inward code\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\nUS Formats:\\n\\\"78704\\\" → zip: \\\"78704\\\"\\n\\\"78704-1234\\\" → zip: \\\"78704\\\", four: \\\"1234\\\"\\n\\\"78704 1234\\\" → \\\"78704-1234\\\"\\n\\\"787041234\\\" → \\\"78704-1234\\\" (9 digits)\\n\\\"78704-\\\" → \\\"78704\\\" (trailing dash removed)\\n\\\"78704   - 1234\\\" → \\\"78704-1234\\\" (extra spaces)\\n\\nCanadian Formats:\\n\\\"Q2E 4U7\\\" → fsa: \\\"Q2E\\\", ldu: \\\"4U7\\\"\\n\\\"q2e4u7\\\" → \\\"Q2E 4U7\\\" (auto-formatted)\\n\\\"q2e      4u7\\\" → \\\"Q2E 4U7\\\" (extra spaces)\\n\\nUK Formats (5 patterns):\\n\\\"A1 1AA\\\" → outcode: \\\"A1\\\", incode: \\\"1AA\\\"\\n\\\"A11AA\\\" → \\\"A1 1AA\\\" (space added)\\n\\\"AA11 1AA\\\" → valid UK format\\n\\\"AA11A 1AA\\\" → valid UK format\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"garbage\\\"`, non-postal code strings\\n\\n**Field Examples:** Postal Code, Property Postal Code\\n\\n**Common Component Usage:**\\n- Check ZIP code: `Postal Code > ZIP equals \\\"78751\\\"`\\n- Identify country: `Postal Code > Country Code equals \\\"US\\\"`\\n- Use only 5-digit ZIP for matching: `{{Postal Code > ZIP}}`\\n\\n---\\n\\n### Data Types\\n\\n#### Boolean Type\\n\\nParses boolean values from various string and numeric representations.\\n\\n**Valid Inputs:**\\n- True: `y`, `yes`, `true`, `t`, `1` (case insensitive)\\n- False: `n`, `no`, `false`, `f`, `0` (case insensitive)\\n- Numeric: `1` → true, `0` → false\\n- With whitespace: `\\\"  true  \\\"` → true\\n\\n**Components:** None\\n\\n**Operators:**\\n- `is true` / `is not true`\\n- `is false` / `is not false`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n\\n**Examples:**\\n```\\n\\\"yes\\\" → true        \\\"no\\\" → false\\n\\\"Y\\\" → true          \\\"N\\\" → false  \\n\\\"TRUE\\\" → true       \\\"FALSE\\\" → false\\n\\\"t\\\" → true          \\\"f\\\" → false\\n1 → true             0 → false\\n\\\"1\\\" → true          \\\"0\\\" → false\\n```\\n\\n**Invalid inputs** (return false with valid=false): `\\\"50\\\"`, `\\\"asdf\\\"`, `{foo: 42}`\\n\\n**Field Examples:** Opt In, Accept Prepayment Penalty, Has Insurance\\n\\n---\\n\\n### City Type\\n\\nSimple string type for city names with no format validation.\\n\\n**Components:**\\n- Raw: Unmodified value\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\n\\\"Austin\\\" → \\\"Austin\\\"\\n\\\"Dallas\\\" → \\\"Dallas\\\"\\n\\\"San Francisco\\\" → \\\"San Francisco\\\"\\n\\\"  Chicago  \\\" → \\\"Chicago\\\"  // Whitespace trimmed\\n```\\n\\n**Field Examples:** City, Property City, Employer City\\n\\n---\\n\\n### Credential Type\\n\\nHandles sensitive credential strings like passwords and API keys. Always masked by default.\\n\\n**Components:** None\\n\\n**Maskable:** Yes (sensitive data replaced with asterisks)\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nDuring processing: \\\"sekret-pazzward\\\" → available for integrations\\nAfter processing (stored as): \\\"****************\\\"\\n\\nDuring processing: \\\"befa4e7379d81173dfe8d1a53deaf591\\\" → available for integrations  \\nAfter processing (stored as): \\\"********************************\\\"\\n```\\n\\n**Field Examples:** API Secret, Password, Authentication Token\\n\\n---\\n\\n### Date Type\\n\\nParses dates in multiple formats and normalizes to ISO format (YYYY-MM-DD).\\n\\n**Supported Formats:**\\n- US: `M/D/YYYY` (`6/2/2014`), `M/D/YY` (`6/2/14`), `MM-DD-YYYY` (`06-02-2014`)\\n- ISO: `YYYY-MM-DD` (`2014-06-02`)\\n- European: `D/M/YYYY` (`18/7/2014`), `D-M-YYYY` (`18-7-2014`)\\n- Compact: `MMDDYYYY` (`06022014`), `YYYYMMDD` (`20140602`)\\n- Natural: `Mon Jun 02 2014`, `Jun 02 2014`, `Fri 18 July 2014`\\n\\n**Components:**\\n- Raw: Unmodified value\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is less than` / `is less than or equal to`\\n- `is greater than` / `is greater than or equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `is between` / `is not between`\\n\\n**Examples:**\\n```\\n\\\"6/2/2014\\\" → \\\"2014-06-02\\\"      \\\"06/02/2014\\\" → \\\"2014-06-02\\\"\\n\\\"6/2/14\\\" → \\\"2014-06-02\\\"        \\\"June 2, 2014\\\" → \\\"2014-06-02\\\"\\n\\\"2014-06-02\\\" → \\\"2014-06-02\\\"    \\\"Mon Jun 02 2014\\\" → \\\"2014-06-02\\\"\\n\\\"06-02-2014\\\" → \\\"2014-06-02\\\"    \\\"06022014\\\" → \\\"2014-06-02\\\"\\n\\\"20140602\\\" → \\\"2014-06-02\\\"      \\\"18/07/2014\\\" → \\\"2014-07-18\\\" (European)\\n```\\n\\n**Field Examples:** Application Date, Move Date, Purchase Date\\n\\n---\\n\\n### DOB Type (Date of Birth)\\n\\nSpecial date type that adds age calculation and is maskable for privacy.\\n\\n**Components:**\\n- Raw: The full date (only accessible during processing)\\n- Age: The age as of today (only accessible during processing)\\n- Year: The year from the DOB (only accessible during processing)\\n\\n**Maskable:** Yes\\n\\n**Operators:** Same as Date type\\n\\n**Examples:**\\n```\\nDuring processing:\\n\\\"1990-01-15\\\" → {\\n  raw: \\\"1990-01-15\\\",\\n  age: 34.9,\\n  year: 1990,\\n  valid: true\\n}\\n\\nAfter processing (stored as): \\\"****-**-**\\\"\\nNo components accessible - all values masked\\n```\\n\\n**Field Examples:** DOB, Mortgage Co-Borrower DOB, Spouse DOB\\n\\n---\\n\\n### Email Type\\n\\nComprehensive email parsing with domain analysis and validation.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- User: Username (before @)\\n- Domain: Full domain (after @)\\n- Host: Domain without TLD\\n- TLD: Top-level domain\\n- Is Free: Boolean for free email providers\\n- Is Disposable: Boolean for temporary emails\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\nStandard:\\n\\\"user@domain.com\\\" → user: \\\"user\\\", domain: \\\"domain.com\\\"\\n\\\"John.Doe@Gmail.com\\\" → \\\"john.doe@gmail.com\\\" (auto-lowercased)\\n\\nPlus Addressing:\\n\\\"user+tag@domain.com\\\" → user: \\\"user+tag\\\"\\n\\\"test+hola@domain.com\\\" → valid: true\\n\\nWith Spaces:\\n\\\"  user@domain.com  \\\" → \\\"user@domain.com\\\" (trimmed)\\n\\\"p. j. butter@gmail.com\\\" → valid: true\\n\\nFree Email Detection:\\n\\\"user@gmail.com\\\" → is_free: true\\n\\\"user@yahoo.com\\\" → is_free: true\\n\\\"user@company.com\\\" → is_free: false\\n\\nDisposable Detection:\\n\\\"user@mailinator.com\\\" → is_disposable: true\\n\\\"user@10minutemail.com\\\" → is_disposable: true\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"Asdf\\\"` (no @), `\\\"hello@//gmail.xn--om.3ia\\\"`\\n\\n**Field Examples:** Email, Work Email, Co-Borrower Email\\n\\n**Common Component Usage:**\\n- Check if email is from a specific domain: `Email > Domain equals \\\"company.com\\\"`\\n- Identify free email providers: `Email > Is Free is true`\\n- Extract username for display: `{{Email > User}}`\\n\\n---\\n\\n### First Name Type\\n\\nSimple string type for given names with basic validation.\\n\\n**Components:**\\n- Raw: Unmodified value\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\n\\\"John\\\" → \\\"John\\\"\\n\\\"Mary-Jane\\\" → \\\"Mary-Jane\\\"\\n\\\"José\\\" → \\\"José\\\"\\n\\\"  Alice  \\\" → \\\"Alice\\\"  // Whitespace trimmed\\n```\\n\\n**Field Examples:** First Name, Co-Borrower First Name\\n\\n---\\n\\n### Gender Type\\n\\nParses gender values with abbreviation support.\\n\\n**Valid Inputs:**\\n- Male: `m`, `male`, `M`, `Male`, `MALE` (case insensitive)\\n- Female: `f`, `female`, `F`, `Female`, `FEMALE` (case insensitive)\\n- Other: `o`, `other`, `O`, `Other`, `OTHER` (case insensitive)\\n- With whitespace: `\\\"  m  \\\"` → male\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Abbreviation: Abbreviated form (M, F, O)\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n\\n**Examples:**\\n```\\n\\\"male\\\" → {               \\\"f\\\" → {\\n  normal: \\\"male\\\",           normal: \\\"female\\\",\\n  raw: \\\"male\\\",              raw: \\\"f\\\",\\n  abbr: \\\"M\\\",                abbr: \\\"F\\\",\\n  valid: true               valid: true\\n}                         }\\n\\n\\\"MALE\\\" → \\\"male\\\"         \\\"other\\\" → abbr: \\\"O\\\"\\n\\\"  m  \\\" → \\\"male\\\"        \\\"O\\\" → \\\"other\\\"\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"50\\\"`, `\\\"asdf\\\"`, `5`, `true`\\n\\n**Field Examples:** Gender, Applicant Gender\\n\\n---\\n\\n### IP Type\\n\\nHandles both IPv4 and IPv6 addresses with format detection.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Is IPv4: Boolean indicating IPv4 format\\n- IPv6 Format: IP converted to IPv6 format\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nIPv4:\\n\\\"198.51.90.161\\\" → is_ipv4: true, ipv6_format: \\\"::ffff:198.51.90.161\\\"\\n\\\"198.51.90.161/32\\\" → CIDR notation supported\\n\\\"http://198.51.90.161:32\\\" → extracted from URL\\n\\\"    198. 51. 90. 161     \\\" → \\\"198.51.90.161\\\" (spaces removed)\\n\\nIPv6:\\n\\\"8faa:230d:52ab:98f3:a2ea:7735:a7b8:72e9\\\" → is_ipv4: false\\n\\\"[8faa:230d:52ab:98f3:a2ea:7735:a7b8:72e9]\\\" → brackets removed\\n\\\"8faa:230d:52ab:98f3:a2ea:7735:a7b8:72e9/64\\\" → CIDR notation\\n\\\"[0000:0000:0000:0000:0000:0000:0000:0001]\\\" → \\\"::1\\\" (compressed)\\n\\\"[ffff::186.25.192.233]\\\" → \\\"ffff::ba19:c0e9\\\" (IPv4 tail)\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"256.4.5.6\\\"`, `\\\"fe80:2030:31:24\\\"` (incomplete IPv6)\\n\\n**Field Examples:** IP Address, Source IP\\n\\n---\\n\\n### Last Name Type\\n\\nSimple string type for family names with basic validation.\\n\\n**Components:**\\n- Raw: Unmodified value\\n\\n**Operators:** Same as First Name type\\n\\n**Examples:**\\n```\\n\\\"Smith\\\" → \\\"Smith\\\"\\n\\\"O'Brien\\\" → \\\"O'Brien\\\"\\n\\\"García-López\\\" → \\\"García-López\\\"\\n```\\n\\n**Field Examples:** Last Name, Co-Borrower Last Name\\n\\n---\\n\\n### Number Type\\n\\nParses numeric values from strings, handling currency symbols and thousands separators.\\n\\n**Components:** None\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is less than` / `is less than or equal to`\\n- `is greater than` / `is greater than or equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `is between` / `is not between`\\n\\n**Examples:**\\n```\\n\\\"100\\\" → 100               \\\"$1,000.99\\\" → 1000.99\\n100 → 100                  \\\"1,234,567\\\" → 1234567\\n\\\"1.111\\\" → 1.111           \\\"-11\\\" → -11\\n\\\"$1100 per month\\\" → 1100  \\\"-$1,100\\\" → -1100\\n\\\"  1100  \\\" → 1100         \\\"1,100\\\" → 1100\\n```\\n\\n**Invalid inputs** (valid=false): `true`, `[1]`, `{foo: 'bar'}`, `\\\"derp\\\"`, `NaN`\\n\\n**Field Examples:** Loan Amount, Monthly Income, Credit Score\\n\\n---\\n\\n### Phone Type\\n\\nComprehensive phone number parsing and validation for US/Canada numbers with real-world verification.\\n\\n**Geographic Limitation**: Currently only supports US and Canadian phone numbers. International numbers from other countries will be marked as invalid (valid: false) and will not parse correctly, even if they have a valid format in their home country.\\n\\n**Advanced Validation**: The `valid` property indicates more than just format correctness - it verifies:\\n- The area code is a real, assigned area code\\n- The exchange is a real exchange within that area code\\n- The area code and exchange legitimately belong together\\n- The number follows valid North American Numbering Plan rules\\n\\nThis means a phone number like \\\"(999) 555-1234\\\" would be invalid even though the format is correct, because 999 is not a real area code.\\n\\n**What It Does NOT Verify**: The validation does NOT check if:\\n- The complete 10-digit number is actually connected/in service\\n- The line (last 4 digits) is valid for that area code and exchange\\n- The number can receive calls or texts\\n\\nA number can pass type validation but still be disconnected or undeliverable.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Area: Area code\\n- Exchange: Exchange code\\n- Line: Line number\\n- Number: Full normalized number\\n- Extension: Extension if present\\n- Country Code: Two-letter country code\\n- Country Calling Code: Numeric country calling code\\n- Type: Number type (home/work/mobile)\\n- Is Tollfree: Boolean for toll-free numbers\\n\\n**Type Hints:** Append `h` (home), `w` (work), `m` (mobile), or `c` (cell) to set type\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nValid US Numbers (real area codes and exchanges):\\n\\\"(512) 789-1111\\\" → area: \\\"512\\\", exchange: \\\"789\\\", line: \\\"1111\\\"\\n\\\"512-789-1111\\\" → \\\"5127891111\\\"\\n\\\"512.789.1111\\\" → \\\"5127891111\\\"\\n\\nInvalid Despite Good Format (fake area code):\\n\\\"(999) 555-1234\\\" → valid: false (999 not a real area code)\\n\\\"(123) 456-7890\\\" → valid: false (123 not a real area code)\\n\\nWith Extensions:\\n\\\"5127891111x123\\\" → extension: \\\"123\\\"\\n\\\"5127891111 x 43\\\" → extension: \\\"43\\\"\\n\\nToll-Free:\\n\\\"8775551212\\\" → is_tollfree: true\\n\\\"1-800-555-1212\\\" → is_tollfree: true\\n\\nWith Type Hints:\\n\\\"5127891111m\\\" → type: \\\"mobile\\\"\\n\\\"5127891111h\\\" → type: \\\"home\\\"\\n\\nMasked Numbers:\\n\\\"1-(512) *** ****\\\" → valid: true (masked)\\n\\\"**********\\\" → valid: true (fully masked)\\n\\nInternational (will NOT parse correctly):\\n\\\"+49 30 22610\\\" → valid: false (not US/Canadian format)\\n\\\"+44 1484 519892\\\" → valid: false (not US/Canadian format)\\nNote: International numbers are not supported unless they coincidentally match US/Canadian patterns\\n```\\n\\n**Invalid inputs** (valid=false): \\n- `\\\"donkey kong\\\"` (not a number)\\n- `\\\"964523331\\\"` (too short)\\n- `\\\"(999) 555-1234\\\"` (invalid area code)\\n- `\\\"(512) 999-1111\\\"` (invalid exchange for 512 area code)\\n\\n**Field Examples:** Phone 1, Phone 2, Mobile Phone, Work Phone\\n\\n**Common Component Usage:**\\n- Check for specific area codes: `Phone 1 > Area equals \\\"512\\\"`\\n- Identify toll-free numbers: `Phone 1 > Is Tollfree is true`\\n- Format for display: `{{Phone 1 > Area}}-{{Phone 1 > Exchange}}-{{Phone 1 > Line}}`\\n- Check validity: `Phone 1 > Valid is true`\\n\\n**Important Limitation**: The `valid` property only confirms the area code and exchange are legitimate - it does NOT verify the full number is connected or deliverable. The \\\"line\\\" portion (last 4 digits) could still be invalid or disconnected. For true deliverability verification, use third-party Add-On services like Trestle, Telesign, or BriteVerify in a flow step to collect carrier-level metadata, then evaluate the appended data in a subsequent filter step to block disconnected numbers.\\n\\n---\\n\\n### Postal Code Type\\n\\nMulti-country postal code parsing supporting US, Canada, and UK formats.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Country Code: Country abbreviation\\n- **US Components:**\\n  - ZIP: First 5 digits\\n  - Four: Last 4 digits (ZIP+4)\\n- **Canadian Components:**\\n  - FSA: Forward sortation area\\n  - LDU: Local delivery unit\\n- **UK Components:**\\n  - Outcode: Outward code\\n  - Incode: Inward code\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\nUS Formats:\\n\\\"78704\\\" → zip: \\\"78704\\\"\\n\\\"78704-1234\\\" → zip: \\\"78704\\\", four: \\\"1234\\\"\\n\\\"78704 1234\\\" → \\\"78704-1234\\\"\\n\\\"787041234\\\" → \\\"78704-1234\\\" (9 digits)\\n\\\"78704-\\\" → \\\"78704\\\" (trailing dash removed)\\n\\\"78704   - 1234\\\" → \\\"78704-1234\\\" (extra spaces)\\n\\nCanadian Formats:\\n\\\"Q2E 4U7\\\" → fsa: \\\"Q2E\\\", ldu: \\\"4U7\\\"\\n\\\"q2e4u7\\\" → \\\"Q2E 4U7\\\" (auto-formatted)\\n\\\"q2e      4u7\\\" → \\\"Q2E 4U7\\\" (extra spaces)\\n\\nUK Formats (5 patterns):\\n\\\"A1 1AA\\\" → outcode: \\\"A1\\\", incode: \\\"1AA\\\"\\n\\\"A11AA\\\" → \\\"A1 1AA\\\" (space added)\\n\\\"AA11 1AA\\\" → valid UK format\\n\\\"AA11A 1AA\\\" → valid UK format\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"garbage\\\"`, non-postal code strings\\n\\n**Field Examples:** Postal Code, Property Postal Code\\n\\n**Common Component Usage:**\\n- Check ZIP code: `Postal Code > ZIP equals \\\"78751\\\"`\\n- Identify country: `Postal Code > Country Code equals \\\"US\\\"`\\n- Use only 5-digit ZIP for matching: `{{Postal Code > ZIP}}`\\n\\n---\\n\\n### Range Type\\n\\nParses numeric ranges and single numbers, calculating statistical values.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Min: Lowest number in range\\n- Max: Highest number in range\\n- Mid: Average rounded down to nearest whole number\\n- Average: Average of min and max\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is less than` / `is less than or equal to`\\n- `is greater than` / `is greater than or equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nRange Formats:\\n\\\"100 to 200\\\" → min: 100, max: 200, mid: 150\\n\\\"100 - 200\\\" → min: 100, max: 200, mid: 150\\n\\\"100 200\\\" → min: 100, max: 200  (space only)\\n\\nGreater Than:\\n\\\"50+\\\" → min: 50, max: Infinity\\n\\\"10+\\\" → min: 10, max: null\\n\\nSingle Values:\\n\\\"100\\\" → min: 100, max: 100, mid: 100\\n100 → min: 100, max: 100\\n\\nDecimals:\\n\\\"5.5\\\" → min: 5.5, max: 5.5\\n\\\"999.95 to 10000.95\\\" → min: 999.95, max: 10000.95\\n\\nCurrency:\\n\\\"$1 to $10\\\" → min: 1, max: 10\\n\\\"$1,000 to $10,000\\\" → min: 1000, max: 10000\\n\\nSpecial Cases:\\n\\\"787041234\\\" → \\\"78704-1234\\\" (9 digits treated as ZIP+4)\\n\\\"-10\\\" → min: -10, max: -10\\n\\\"-10+\\\" → min: -10, max: null\\n\\\"  1 to 10  \\\" → min: 1, max: 10 (whitespace trimmed)\\n\\nDate/Time Ranges:\\n\\\"2015-07-01 - 2015-07-25\\\" → date range\\n\\\"2015-07-01T01:59:32.022Z - 2015-07-25T01:59:32:021Z\\\" → time range\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"asdf\\\"`, non-numeric strings\\n\\n**Field Examples:** Age, Income Range, Years at Residence\\n\\n---\\n\\n### SSN Type (Social Security Number)\\n\\nUS Social Security Number parsing with masking for privacy.\\n\\n**Components:**\\n- Raw: Unmodified value (only accessible during processing)\\n- First Three: First three digits (only accessible during processing)\\n- Middle Two: Middle two digits (only accessible during processing)\\n- Last Four: Last four digits (only accessible during processing)\\n\\n**Maskable:** Yes\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nDuring processing:\\n\\\"123456789\\\" → first_three: \\\"123\\\", middle_two: \\\"45\\\", last_four: \\\"6789\\\"\\n\\\"123-45-6789\\\" → \\\"123456789\\\" (dashes removed)\\n\\\"123 45 6789\\\" → \\\"123456789\\\" (spaces removed)\\n\\\"123.45.6789\\\" → \\\"123456789\\\" (dots removed)\\n\\\"  123-45-6789  \\\" → \\\"123456789\\\" (trimmed)\\n\\\"donkey 123456789\\\" → \\\"123456789\\\" (text ignored)\\n\\nAfter processing (stored as): \\\"*********\\\"\\nNo components accessible - all values masked\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"abcd\\\"`, `\\\"\\\"`, `\\\"   \\\"`\\n\\n**Field Examples:** Social Security Number\\n\\n**Common Component Usage (During Processing Only):**\\n- Check last four digits: `Social Security Number > Last Four equals \\\"1234\\\"`\\n- Send to integration: `{{Social Security Number > Last Four}}`\\n- Check if provided: `Social Security Number > Valid is true`\\n\\n**Note:** After processing completes, these components are NOT available\\n\\n---\\n\\n### State Type\\n\\nUS states and Canadian provinces with abbreviation normalization.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Name: Full state/province name\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nUS States:\\n\\\"TX\\\" → name: \\\"Texas\\\"\\n\\\"tx\\\" → \\\"TX\\\" (auto-uppercased)\\n\\\"Texas\\\" → \\\"TX\\\"\\n\\\"texas\\\" → \\\"TX\\\"\\n\\nCanadian Provinces:\\n\\\"ON\\\" → name: \\\"Ontario\\\"\\n\\\"Quebec\\\" → \\\"QC\\\", name: \\\"Quebec\\\"\\n\\nUnknown Values (still valid=true):\\n\\\"DX\\\" → \\\"DX\\\" (unknown but preserved)\\n\\\"Dexus\\\" → \\\"Dexus\\\"\\n\\\"DEXUS NEXUS\\\" → \\\"DEXUS NEXUS\\\"\\n```\\n\\n**Field Examples:** State, Property State, License State\\n\\n---\\n\\n### Street Type\\n\\nStreet address parsing with number and name extraction.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Number: Street number\\n- Name: Street name\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:**\\n```\\n\\\"123 Main Street\\\" → number: \\\"123\\\", name: \\\"Main Street\\\"\\n\\\"4203 Guadalupe St\\\" → number: \\\"4203\\\", name: \\\"Guadalupe St\\\"\\n\\\"  123 Main St  \\\" → \\\"123 Main St\\\" (trimmed)\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"Main Street\\\"` (no number), `\\\"Asdf\\\"`\\n\\n**Field Examples:** Address 1, Property Address\\n\\n---\\n\\n### String Type\\n\\nUniversal text type with no format requirements.\\n\\n**Components:** None\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n- `matches pattern` / `does not match pattern`\\n\\n**Examples:** Any text value\\n\\n**Field Examples:** Comments, Description, Custom Field 1\\n\\n---\\n\\n### Time Type\\n\\nNatural language datetime parsing with flexible format support.\\n\\n**Components:**\\n- Raw: Unmodified value\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is less than` / `is less than or equal to`\\n- `is greater than` / `is greater than or equal to`\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n- `is between` / `is not between`\\n\\n**Examples:**\\n```\\nNatural Language:\\n\\\"June 14, 2015 6:27 PM\\\" → \\\"2015-06-14T18:27:00.000Z\\\"\\n\\\"Sat Jun 14 2014 13:27:33 GMT-0500 (CDT)\\\" → ISO datetime\\n\\\"yesterday at 3pm\\\" → (calculated datetime)\\n\\nISO Formats:\\n\\\"2015-06-14T18:27:33Z\\\" → \\\"2015-06-14T18:27:33.000Z\\\"\\n\\\"2015-06-14T18:27:33.123Z\\\" → with milliseconds\\n\\\"2015-06-14T18:27:33.12345Z\\\" → with microseconds\\n\\nOther Formats:\\n\\\"06/14/2014 6:27:33 PM\\\" → ISO datetime\\nJavaScript Date objects → ISO datetime\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"garbage\\\"`, `{foo: 42}`\\n\\n**Field Examples:** Submission Time, Appointment Time\\n\\n---\\n\\n### TrustedForm URL Type\\n\\nSpecialized type for TrustedForm certificate URLs with validation.\\n\\n**Components:**\\n- Raw: Unmodified certificate URL\\n- Certificate ID: Certificate identifier\\n- Type: Certificate type (web/facebook/mobile/masked)\\n- Is Masked: Boolean for masked certificates\\n- Is Web: Boolean for web certificates\\n- Is Mobile: Boolean for mobile certificates\\n- Is Facebook: Boolean for Facebook Lead Ads certificates\\n\\n**Special Validation:**\\n- Must be HTTPS\\n- Must be from valid TrustedForm domain\\n- Certificate expires after 90 days\\n- Environment must match (production/staging)\\n\\n**Operators:**\\n- `is blank` / `is not blank`\\n- `format is valid` / `format is invalid`\\n\\n**Examples:**\\n```\\nWeb Certificates:\\n\\\"https://cert.trustedform.com/eb9fc4dd9bed9ad451a5648946cf4bf09b5bb947\\\"\\n  → type: \\\"web\\\", is_web: true\\n\\nFacebook Certificates:\\n\\\"https://cert.trustedform.com/0.GUr7[...very long...]\\\" (with dots)\\n  → type: \\\"facebook\\\", is_facebook: true\\n\\nMobile Certificates:\\n\\\"https://cert.trustedform.com/[64-character-id]\\\"\\n  → type: \\\"mobile\\\", is_mobile: true\\n\\nStaging/Dev URLs:\\nAllowed in non-production environments\\n```\\n\\n**Invalid inputs** (valid=false): \\n- Non-HTTPS URLs\\n- Wrong domain\\n- Malformed certificate IDs\\n- Expired certificates (>90 days)\\n\\n**Field Examples:** TrustedForm Certificate URL\\n\\n---\\n\\n### URL Type\\n\\nGeneral URL parsing with component extraction.\\n\\n**Components:**\\n- Raw: Unmodified value\\n- Protocol: Protocol (http/https)\\n- Host: Host name\\n- Port: Port number if present\\n- Path: URL path\\n- Query: Query string\\n- Hash: Fragment/hash if present\\n\\n**Operators:**\\n- `is equal to` / `is not equal to`\\n- `is blank` / `is not blank`\\n- `is obscene` / `is not obscene`\\n- `format is valid` / `format is invalid`\\n- `includes` / `does not include`\\n- `is included in` / `is not included in`\\n\\n**Examples:**\\n```\\nFull URLs:\\n\\\"https://google.com/search?q=hi#results\\\"\\n  → protocol: \\\"https\\\", host: \\\"google.com\\\", path: \\\"/search\\\", query: \\\"q=hi\\\", hash: \\\"results\\\"\\n\\nPartial URLs:\\n\\\"centennialbulb.org\\\" → host: \\\"centennialbulb.org\\\" (no protocol)\\n\\\"172.0.0.1\\\" → valid IP as URL\\n\\\"http\\\" → protocol only\\n\\\"whatever\\\" → treated as domain\\n```\\n\\n**Invalid inputs** (valid=false): `\\\"\\\"`, `\\\" \\\"`, `\\\"https://\\\"`, `\\\"donkey://google.com\\\"`\\n\\n**Field Examples:** Landing Page URL, Referrer URL\\n\\n## How Types Work in Practice\\n\\n### Automatic Normalization - No Manual Work Needed\\n\\nTypes automatically normalize data - you don't need to:\\n- **Email**: Automatically lowercased (never use {{lowercase email}})\\n- **Phone**: Automatically normalized to 10 digits\\n- **State**: Automatically converted to 2-letter abbreviation\\n- **Postal Code**: Automatically formatted\\n- **Names**: Automatically trimmed of whitespace\\n\\nThe type system handles ALL normalization - just pass the raw data!\\n\\n### Standardization in Action\\n\\nTypes accept chaotic input and produce consistent output:\\n\\n**Phone Number Standardization:**\\n```\\n\\\"(512) 789-1111\\\" → \\\"5127891111\\\"\\n\\\"512-789-1111\\\"   → \\\"5127891111\\\"  \\n\\\"512.789.1111\\\"   → \\\"5127891111\\\"\\n\\\"5127891111\\\"     → \\\"5127891111\\\"\\n\\\"+1 512 789 1111\\\" → \\\"5127891111\\\"\\n```\\n\\nAll produce the same normalized format with identical components.\\n\\n**Date Standardization:**\\n```\\n\\\"6/2/2014\\\"      → \\\"2014-06-02\\\"\\n\\\"June 2, 2014\\\"  → \\\"2014-06-02\\\"\\n\\\"2014-06-02\\\"    → \\\"2014-06-02\\\"\\n\\\"06-02-2014\\\"    → \\\"2014-06-02\\\"\\n\\\"20140602\\\"      → \\\"2014-06-02\\\"\\n```\\n\\nAll produce ISO format dates.\\n\\n### Validation Without Rejection\\n\\nWhen types encounter invalid data:\\n\\n1. **Parsing continues**: The system doesn't stop\\n2. **`valid` is set to false**: Marking the data quality issue\\n3. **`raw` preserves input**: Original data is never lost\\n4. **Components may be empty**: But the structure remains\\n5. **Flows continue**: You decide how to handle invalid data\\n\\nExample:\\n```javascript\\n// Invalid phone number\\nInput: \\\"not a phone\\\"\\nResult: {\\n  normal: \\\"notaphone\\\",  // Non-digits removed\\n  raw: \\\"not a phone\\\",   // Original preserved\\n  valid: false,         // Marked as invalid\\n  // No components extracted\\n}\\n// Lead continues processing!\\n```\\n\\n### Component Usage Best Practices\\n\\n**Always prefer components over string manipulation:**\\n\\n✅ **Good - Using Components:**\\n```javascript\\n// Check area code\\nPhone 1 > Area equals \\\"512\\\"\\n\\n// Check email domain\\nEmail > Domain equals \\\"gmail.com\\\"\\n\\n// Check ZIP code\\nPostal Code > ZIP equals \\\"78701\\\"\\n```\\n\\n❌ **Bad - String Manipulation:**\\n```javascript\\n// Don't do this!\\nsubstring(Phone 1, 0, 3) equals \\\"512\\\"\\nsplit(Email, \\\"@\\\")[1] equals \\\"gmail.com\\\"\\nsubstring(Postal Code, 0, 5) equals \\\"78701\\\"\\n```\\n\\nComponents are:\\n- Already parsed and validated\\n- More efficient (no runtime parsing)\\n- More reliable (handle edge cases)\\n- Clearer in intent\\n\\n## Special Type Behaviors\\n\\n### Maskable Types\\n\\nSome types contain sensitive data that are automatically masked for security:\\n- **SSN**: Social Security Numbers - all components masked\\n- **DOB**: Dates of birth - all components masked (including age and year)\\n- **Credential**: Passwords and API keys - entire value masked\\n\\n**How Masking Works:**\\n\\n1. **During Processing**: LeadConduit can use the full, unmasked field value and all components while the lead is being processed\\n2. **After Processing**: Values are written to the database as `*` characters only\\n3. **No Components Preserved**: Unlike other types, maskable types do NOT preserve any components - everything is masked\\n4. **Permanent**: The unmasked values and components exist only in memory during processing - they are gone forever after that\\n5. **What You See**: \\n   - UI displays: Masked values only, no components\\n   - API responses: Masked values only, no components\\n   - Event exports: Masked values only, no components\\n   - Reports: No data available for these fields\\n\\n**Example of SSN Masking:**\\n```\\nDuring processing: \\\"123-45-6789\\\" → Available for rules and integrations\\nIn database/UI/API: \\\"*********\\\" → Only masked version stored\\nComponents: NOT preserved - no SSN data accessible after processing\\n```\\n\\n**Example of DOB Masking:**\\n```\\nDuring processing: \\\"1990-01-15\\\" → Age: 34.9, Year: 1990 available\\nIn database/UI/API: \\\"****-**-**\\\" → Only masked version stored\\nComponents: NOT preserved - no DOB data accessible after processing\\n```\\n\\n**Example of Credential Masking:**\\n```\\nDuring processing: \\\"mypassword123\\\" → Available for integrations\\nIn database/UI/API: \\\"*************\\\" → Only masked version stored\\n```\\n\\nThis ensures sensitive data can be used for processing (validation, delivery to buyers) while maintaining security and compliance by never storing the actual values or any components.\\n\\n### Types with Special Validation\\n\\n**TrustedForm URL**:\\n- Must be HTTPS\\n- Must be from valid TrustedForm domain\\n- Certificate must not be older than 90 days\\n- Environment must match (production/staging)\\n\\n**Email**:\\n- Detects free providers (Gmail, Yahoo, etc.)\\n- Identifies disposable/temporary emails\\n- Normalizes to lowercase\\n\\n**Phone**:\\n- Validates actual area codes and exchanges (not just format)\\n- Verifies area code/exchange combinations are real\\n- Only supports US/Canadian numbers currently\\n- Supports type hints (h=home, w=work, m=mobile)\\n- Detects toll-free numbers\\n- Handles extensions\\n- Recognizes masked numbers\\n\\n### Always-Valid Types\\n\\nSome types never return `valid: false`:\\n- **String**: Any text is valid\\n- **City**: Any city name is valid\\n- **State**: Any locality is valid\\n- **First/Last Name**: Any name is valid\\n- **Credential**: Any credential is valid\\n\\nThese types accept any string input because there's no universal format to validate against.\\n\\n## Type Selection Guide\\n\\n### When to Use Each Type\\n\\n**String**: Default for text without specific format requirements\\n- Custom fields\\n- Comments\\n- Descriptions\\n- Generic text data\\n\\n**Number**: Numeric data for calculations or comparisons\\n- Prices\\n- Quantities  \\n- Scores\\n- IDs\\n\\n**Boolean**: Yes/no decisions\\n- Opt-ins\\n- Preferences\\n- Flags\\n- Consent\\n\\n**Email**: Contact emails requiring validation\\n- Primary contact\\n- Marketing emails\\n- Account emails\\n\\n**Phone**: Phone numbers needing standardization\\n- Contact numbers\\n- SMS numbers\\n- Call tracking\\n\\n**Date/Time**: Temporal data\\n- Submission dates\\n- Appointment times\\n- Deadlines\\n\\n**DOB**: Special handling for birth dates\\n- Age verification\\n- Age-based decisions\\n- Demographics\\n\\n**Postal Code**: Location-based decisions\\n- Geographic targeting\\n- Shipping addresses\\n- Tax determination\\n\\n**SSN**: Highly sensitive identification\\n- Credit checks\\n- Identity verification\\n- Compliance requirements\\n\\n## Common Patterns\\n\\n### Multi-Format Input Handling\\nTypes gracefully handle various input formats:\\n```\\nBoolean: \\\"yes\\\", \\\"y\\\", \\\"1\\\", \\\"true\\\" → true\\nState: \\\"TX\\\", \\\"Texas\\\", \\\"tx\\\", \\\"texas\\\" → \\\"TX\\\"\\nPhone: Multiple formats → Single standard\\n```\\n\\n### Progressive Enhancement\\nTypes extract as much value as possible:\\n```\\nValid email → All components extracted\\nInvalid email → Still preserves raw, domain might be partial\\nValid phone → All components available\\nInvalid phone → Raw preserved, some components may exist\\n```\\n\\n### Business Logic Enablement\\nTypes enable sophisticated rules without complexity:\\n```\\nIF Email > Is Free is true THEN apply different pricing\\nIF Phone 1 > Is Tollfree is true THEN flag for review\\nIF DOB > Age is less than 18 THEN require guardian consent\\nIF Postal Code > Country Code equals \\\"US\\\" THEN use US validation\\n```\\n\\n## Integration with LeadConduit\\n\\n### Field Type Assignment\\nIn flow configuration:\\n1. Each field can be assigned a type\\n2. Types are applied during lead processing\\n3. Parsed data replaces raw input\\n4. Components become available immediately\\n\\n### Rule Evaluation\\nTypes integrate with the rules engine:\\n- Use `valid` property in conditions\\n- Access components directly\\n- Compare normalized values\\n- Apply type-specific operators\\n\\n### Data Flow\\n1. **Input arrives** in various formats\\n2. **Types parse** based on field configuration\\n3. **Normalization** prepares for storage\\n4. **Components** available in rules/mappings\\n5. **Storage** uses normalized format\\n6. **Delivery** can use any component\\n\\n\"},{\"name\":\"Rules\",\"x-traitTag\":true,\"description\":\"LeadConduit uses a rules engine to customize flow behavior based on field data, appended data, or internal\\ntracking metadata (such as the submission timestamp). The rules engine is built into flow acceptance criteria,\\nfiltering, volume caps, pricing, mappings, and more. \\n\\n### Rule Set\\n\\nRules belong to a set which has the following properties:\\n\\n * `op` &mdash; `and` or `or` determines whether all rules in set must pass or just one\\n * `rules` &mdash; the array of Rules and/or Rule Sets to evaluate\\n\\n### Rules\\n\\nEach element of the `rules` array can be a Rule or another Rule Set.\\n\\nRules have the following properties:\\n * `lhv` &mdash; left hand value is a key to look up a value from the lead data context\\n * `op` &mdash; operator Name of the operator \\n * `rhv` &mdash; right hand value (omit for unary operators like `is blank`)\\n * `rule_set` &mdash; optional rule set to be ANDed with the rule\\n\\n### Variables\\n\\nWhen rules are processed the `lhv` will be resolved to a value using the data in the variables found under that key. For example, if the `lhv`\\nis \\\"lead.first_name\\\" and the variables are `{ \\\"lead\\\": { \\\"first_name\\\": \\\"Bob\\\" } }`, then the resolved `lhv` will be \\\"Bob\\\".\\n\\n### Templating\\n\\nThe `lhv` and `rhv` of each rule supports (templating)[https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/]. The variables are used to evaluate the template.\\n\"},{\"name\":\"Invitations\",\"description\":\"Invite another account to connect\"},{\"name\":\"Onboards\",\"description\":\"Onboards are records that track the buyer connection onboarding process in LeadConduit. When a buyer accepts an invitation to connect with a seller, an onboard record is created to manage and track the setup workflow.\\n\\n## Overview\\n\\nThe onboarding process involves:\\n\\n1. **Creating an Onboard** - When a buyer accepts a connection invitation, an onboard record is created with status `created`. Optionally, the UI can send a `flow_id` if already available\\n2. **In Progress** - The UI sends a PUT with the user's `flow_id` and status `in_progress`\\n3. **Completing Setup** - The UI must send a PUT with status `completed` to notify the backend that the onboard process is finished. The backend then calls `/onboard/buyer` to finish the flow synchronization\\n\\n**Note:** The `/onboard/buyer` endpoint can also be called directly by the UI modal when the user has already completed a previous onboard process.\\n\\n## Onboard Statuses\\n\\n| Status | Description |\\n|--------|-------------|\\n| `created` | Initial state when the onboard is first created |\\n| `in_progress` | The UI has sent the user's `flow_id` |\\n| `completed` | The backend triggers the buyer delivery setup by calling `/onboard/buyer` |\\n| `failed` | The setup process encountered an error |\\n\\n## Buyer Setup Process\\n\\nThe backend automatically triggers the buyer delivery setup when the onboard status is set to `completed`. This process performs:\\n\\n1. **Connection Validation** - Verifies the connection exists and hasn't already been set up\\n2. **Seller Flow Discovery** - Finds all seller flows that have a buyer step pointing to this buyer\\n3. **Buyer Flow Setup** - Creates or updates the buyer's flow to receive leads from the seller\\n4. **Seller Flow Updates** - Adds the buyer's `flow_id` to the seller's flow mappings\\n5. **Notifications** - Sends email notifications to seller account users about the new connection\\n6. **Connection Flagging** - Marks the connection as having buyer delivery configured\\n\"},{\"name\":\"Variables\",\"x-traitTag\":true,\"description\":\"A variable is a key/value pair that is available to filters, rule sets\\nand mappings and in templates at run time while processing a lead.\\n\\nEvery lead is born with a standard set of variables, and additional\\nvariables are added at run-time as leads are processed by each step in\\nthe flow. The full set of variables are stored on every event (in the\\n`vars` property) generated during lead processing.\\n\\nVariables are stored on events as nested objects and are referenced at\\nruntime using dot-notation. There are several top-level variable prefixes\\nthat logically group variables.\\n\"},{\"name\":\"Caps and Limits\",\"description\":\"LeadConduit supports two controls that set constraints on lead submissions and pings. \\n\\n### Cap\\nA cap allows limiting the number of leads sent to a flow. If a lead is successful, it will be counted against the\\n`maximum` configured leads. If configured, the rule set will be evaluated to determine whether a lead will be counted\\nagainst the cap.\\n\"},{\"name\":\"Lead Submission\",\"x-traitTag\":true,\"description\":\"How lead handling works\\n\\n\"},{\"name\":\"Templates\",\"x-traitTag\":true,\"description\":\"# LeadConduit Templates\\n\\n## Overview\\n\\nTemplates are the dynamic value engine of LeadConduit. They transform static configurations into intelligent, adaptive systems by resolving variables, computing values, and manipulating data at runtime. Think of templates as smart placeholders that know how to fetch and transform data when needed.\\n\\nTemplates answer a fundamental question:\\n**How do I get the right value at the right time?**\\n\\nTemplates work seamlessly with rules and mappings:\\n- **Rules** use templates for dynamic comparisons\\n- **Mappings** use templates to compute values\\n- **Templates** provide the bridge between configuration and runtime data\\n\\n## Why Templates Exist\\n\\n### The Static Configuration Problem\\nWithout templates, every value would be hard-coded:\\n- Phone format: \\\"(512) 789-1111\\\" for everyone\\n- Greeting: \\\"Hello Customer\\\" instead of personalized\\n- Dates: Fixed instead of calculated\\n- Prices: Static instead of computed\\n\\nTemplates make configurations come alive with actual data.\\n\\n### The Data Access Problem\\nLead data has complex structures:\\n- Nested objects: `address_1`, `city`\\n- Array elements: `tags[0]`\\n- Type components: `phone.area`\\n- Calculated values: `price * tax_rate`\\n\\nTemplates provide a consistent way to access any data, anywhere.\\n\\n### The Transformation Problem\\nRaw data rarely matches what you need:\\n- Dates need formatting\\n- Names need case changes\\n- Numbers need calculations\\n- Strings need manipulation\\n\\nTemplates include helpers that transform data on the fly.\\n\\n### Technical Details\\n\\nLeadConduit supports combining, [formatting](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/#tag/Templates/section/Variable-Formatting),\\n[hashing](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/#tag/Templates/section/Variable-Hashing), and [performing math](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/#tag/Templates/section/Variable-Math) on\\nvalues using template markup. Templating in LeadConduit is based on the\\npopular [Handlebars](https://handlebarsjs.com/) semantic templating\\nlibrary. A template is a string which contains any number of variable\\nplaceholders\\n\\n## Template Variable\\n\\nVariable placeholders in templates start and end with two curly-brace\\ncharacters: `{{ lead.first_name }}`. Multiple placeholders can be\\ncombined in a single template: `{{ lead.first_name }} {{ lead.last_name\\n}}`. The [universe of possible variables](https://developers.activeprospect.com/docs/leadconduit/api/tag/Variables/) available to a\\ntemplate depends on the [fields](https://developers.activeprospect.com/docs/leadconduit/api/tag/Fields/) defined in your flow and the\\nsteps you've added to your flow.\\n\\n## Variable Formatting\\n\\nLeadConduit has a built-in helper for formatting numbers and dates.\\nFormatting a value is done with the `format` helper.  If the value is a\\ndate field, then you may use date formatting options with the helper.\\nIf it's a number field, then you may use the number formatting options\\nwith the helper.\\n\\n### Date Variable Formatting\\n\\nTo format a date, use the `format` helper: `{{ format lead.dob\\nformat=\\\"YYYY-MM-DD\\\" }}` results in '2015-06-24'. The `format` option is\\na string which defines the format of the date. This format can be any\\ncombination of the below tokens.  To escape characters in format\\nstrings, you can wrap the characters in square brackets: `{{ format\\nlead.dob format=\\\"[It's] MMMM Do\\\" }}` results in \\\"It's October 12th\\\".\\n\\n#### Date Format Tokens\\n\\n|                            | Token                      | Output     |\\n| -------------------------- | -------------------------- | -----------|\\n| Month                      | `M`                          | 1 2 ... 11 12\\n|                            | `Mo`                         | 1st 2nd ... 11th 12th\\n|                            | `MM`                         | 01 02 ... 11 12\\n|                            | `MMM`                        | Jan Feb ... Nov Dec\\n|                            | `MMMM`                       | January February ... November December\\n| Quarter                    | `Q`                          | 1 2 3 4\\n|                            | `Qo`                         | 1st 2nd 3rd 4th\\n| Day of Month               | `D`                          | 1 2 ... 30 31\\n|                            | `Do`                         | 1st 2nd ... 30th 31st\\n|                            | `DD`                         | 01 02 ... 30 31\\n| Day of Year                | `DDD`                        | 1 2 ... 364 365\\n|                            | `DDDo`                       | 1st 2nd ... 364th 365th\\n|                            | `DDDD`                       | 001 002 ... 364 365\\n| Day of Week                | `d`                          | 0 1 ... 5 6\\n|                            | `do`                         | 0th 1st ... 5th 6th\\n|                            | `dd`                         | Su Mo ... Fr Sa\\n|                            | `ddd`                        | Sun Mon ... Fri Sat\\n|                            | `dddd`                       | Sunday Monday ... Friday Saturday\\n| Day of Week (Locale)       | `e`                          | 0 1 ... 5 6\\n| Day of Week (ISO)          | `E`                          | 1 2 ... 6 7\\n| Week of Year               | `w`                          | 1 2 ... 52 53\\n|                            | `wo`                         | 1st 2nd ... 52nd 53rd\\n|                            | `ww`                         | 01 02 ... 52 53\\n| Week of Year (ISO)         | `W`                          | 1 2 ... 52 53\\n|                            | `Wo`                         | 1st 2nd ... 52nd 53rd\\n|                            | `WW`                         | 01 02 ... 52 53\\n| Year                       | `YY`                         | 70 71 ... 29 30\\n|                            | `YYYY`                       | 1970 1971 ... 2029 2030\\n|                            | `Y`                         | 1970 1971 ... 9999 +10000 +10001 Note: This complies with the ISO 8601 standard for dates past the year 9999\\n| Week Year                  | `gg`                         | 70 71 ... 29 30\\n|                            | `gggg`                       | 1970 1971 ... 2029 2030\\n| Week Year (ISO)            | `GG`                         | 70 71 ... 29 30\\n|                            | `GGGG`                       | 1970 1971 ... 2029 2030\\n| AM/PM                      | `A`                          | AM PM\\n|                            | `a`                          | am pm\\n| Hour                       | `H`                          | 0 1 ... 22 23\\n|                            | `HH`                         | 00 01 ... 22 23\\n|                            | `h`                          | 1 2 ... 11 12\\n|                            | `hh`                         | 01 02 ... 11 12\\n|                            | `k`                          | 1 2 ... 23 24\\n|                            | `kk`                         | 01 02 ... 23 24\\n| Minute                     | `m`                          | 0 1 ... 58 59\\n|                            | `mm`                         | 00 01 ... 58 59\\n| Second                     | `s`                          | 0 1 ... 58 59\\n|                            | `ss`                         | 00 01 ... 58 59\\n| Fractional Second          | `S`                          | 0 1 ... 8 9\\n|                            | `SS`                         | 00 01 ... 98 99\\n|                            | `SSS`                        | 000 001 ... 998 999\\n|                            | `SSSS ... SSSSSSSSS`         | 000[0..] 001[0..] ... 998[0..] 999[0..]\\n| Time Zone                  | `z` or `zz`                  | EST CST ... MST PST (requires use of the `timezone` option)\\n|                            | `Z`                          | -07:00 -06:00 ... +06:00 +07:00\\n|                            | `ZZ`                         | -0700 -0600 ... +0600 +0700\\n| Unix Timestamp             | `X`                          | 1360013296\\n| Unix Millisecond Timestamp | `x`                          | 1360013296123\\n\\n#### Localized Date Formats\\n\\nBecause preferred formatting differs based on locale, there are a few\\ntokens that can be used to format a moment based on its locale.  There\\nare upper and lower case variations on the same formats. The lowercase\\nversion is intended to be the shortened version of its uppercase\\ncounterpart.  To change the locale, use the `locale` options: `{{\\nformat date format=\\\"LLL\\\" locale=\\\"fr\\\" }}` results in \\\"24 june 2015 17:24\\\".\\n\\n|                                      | Format string | Output          |\\n| ------------------------------------ | ------------- | ----------------|\\n| Time                                 | `LT`            | 8:30 PM\\n| Time with seconds                    | `LTS`           | 8:30:25 PM\\n| Month numeral, day of month, year    | `L`             | 09/04/1986\\n|                                      | `l`             | 9/4/1986\\n| Month name, day of month, year       | `LL`            | September 4, 1986\\n|                                      | `ll`            | Sep 4, 1986\\n| Month name, day of month, year, time | `LLL`           | September 4, 1986 8:30 PM\\n|                                      | `lll`           | Sep 4, 1986 8:30 PM\\n| Month name, day of month, day of week, year, time | `LLLL` | Thursday, September 4, 1986 8:30 PM\\n|                                      | `llll`          | Thu, Sep 4, 1986 8:30 PM\\n\\n### Number Variable Formatting\\n\\nTo format a number, use the `format` helper: `{{ format\\nlead.mortgage.first_mortgage_balance format=\\\"$0,0.00\\\"}}` results in\\n'$45,302.00'. The `format` option is a string which defines the format\\nof the number. See the table of examples below:\\n\\n| Number     | Format       | String      |\\n| ---------- | ------------ | ----------- |\\n| 10000      | `0,0.0000`   | 10,000.0000\\n| 10000.23   | `0,0`        | 10,000\\n| 10000.23   | `+0,0`       | +10,000\\n| -10000     | `0,0.0`      | -10,000.0\\n| 10000.1234 | `0.000`      | 10000.123\\n| 100.1234   | `00000`      | 00100\\n| 1000.1234  | `000000,0`   | 001,000\\n| 10         | `000.00`     | 010.00\\n| 10000.1234 | `0[.]00000`  | 10000.12340\\n| -10000     | `(0,0.0000)` | (10,000.0000)\\n| -0.23      | `.00`        | -.23\\n| -0.23      | `(.00)`      | (.23)\\n| 0.23       | `0.00000`    | 0.23000\\n| 0.23       | `0.0[0000]`  | 0.23\\n| 1230974    | `0.0a`       | 1.2m\\n| 1460       | `0 a`        | 1 k\\n| -104000    | `0a`         | -104k\\n| 1          | `0o`         | 1st\\n| 100        | `0o`         | 100th\\n| 1000.234   | `$0,0.00`    | $1,000.23\\n| 1000.2     | `0,0[.]00 $` | 1,000.20 $\\n| 1001       | `$ 0,0[.]00` | $ 1,001\\n| -1000.234  | `($0,0)`     | ($1,000)\\n| -1000.234  | `$0.00`      | -$1000.23\\n| 1230974    | `($ 0.00 a)` | $ 1.23 m\\n\\nUse the `locale` option to format the number to a particular locale:\\n`{{ format lead.mortgage.first_mortgage_balance locale=\\\"fr\\\"\\nformat=\\\"$0,0.00\\\" }}` results in '€45 302.00'.\\n\\n### Converting Number and Boolean to String\\n\\nFields of type number and boolean can be converted to string using the `format` helper with the `dataType=\\\"String\\\"` option:\\n\\n`{{format field_name dataType=\\\"String\\\"}}`\\n\\nExample:\\n- Input: `{{format lead.age dataType=\\\"String\\\"}}` with `lead.age` = 30\\n- Output: \\\"30\\\"\\n\\n### Converting String to Number\\n\\nFields whose final result from the `format` helper is a string can be converted to a number if the `dataType=\\\"Number\\\"` option is passed and the value is a string representing a valid number.\\n\\nExamples:\\n- Input: `{{format lead.postal_code dataType=\\\"Number\\\"}}` with `lead.postal_code` = '78751'\\n- Output: 78751 (as a number value)\\n\\nIf the string does not represent a valid number, the result will not be converted:\\n- Input: `{{format lead.postal_code dataType=\\\"Number\\\"}}` with `lead.postal_code` = 'H3Z 2Y7'\\n- Output: 'H3Z 2Y7'\\n\\nThis can also be used with dates if the formatting returns only numbers, such as epoch time:\\n- Input: `{{format lead.source_timestamp format=\\\"X\\\" dataType=\\\"Number\\\"}}` with `lead.source_timestamp` = '2015-06-24T17:24:49.060Z'\\n- Output: 1435166689 (as a number value)\\n\\n\\n## Variable String Manipulation\\n\\nStrings can be manipulated with the following helpers:\\n\\n### Lowercase\\n\\nTransforms the value to lowercase:\\n\\n`{{lowercase field_name}}`\\n\\nExample:\\n- Input: `{{lowercase lead.first_name}}` with `lead.first_name` = \\\"Mike\\\"\\n- Output: \\\"mike\\\"\\n\\n### Uppercase\\n\\nTransforms the value to uppercase:\\n\\n`{{uppercase field_name}}`\\n\\nExample:\\n- Input: `{{uppercase lead.first_name}}` with `lead.first_name` = \\\"Mike\\\"\\n- Output: \\\"MIKE\\\"\\n\\n### Substring\\n\\nReturns a substring from the start position to the end position, or from the start position to the end of the string if no end position is provided:\\n\\n`{{substring field_name start=\\\"3\\\"}}`\\n\\nExample:\\n- Input: `{{substring lead.first_name start=\\\"3\\\"}}` with `lead.first_name` = \\\"Michael\\\"\\n- Output: \\\"chael\\\"\\n\\n`{{substring field_name start=\\\"2\\\" end=\\\"4\\\"}}`\\n\\nExample:\\n- Input: `{{substring lead.first_name start=\\\"2\\\" end=\\\"4\\\"}}` with `lead.first_name` = \\\"Michael\\\"\\n- Output: \\\"ich\\\"\\n\\n### Replace\\n\\nReplaces the pattern with the content of the replace option. The pattern can be a literal string or a regular expression using the `regexp()` option:\\n\\n`{{replace field_name pattern=\\\"Mi\\\" replace=\\\"At\\\"}}`\\n\\nExample:\\n- Input: `{{replace lead.first_name pattern=\\\"Mi\\\" replace=\\\"At\\\"}}` with `lead.first_name` = \\\"Michael\\\"\\n- Output: \\\"Atchael\\\"\\n\\n`{{replace field_name pattern=\\\"regexp(h.{3})\\\" replace=\\\"ke\\\"}}`\\n\\nExample:\\n- Input: `{{replace lead.first_name pattern=\\\"regexp(h.{3})\\\" replace=\\\"ke\\\"}}` with `lead.first_name` = \\\"Michael\\\"\\n- Output: \\\"Micke\\\"\\n\\n### Extract\\n\\nExtracts all occurrences found with the regular expression in the pattern:\\n\\n`{{extract field_name pattern=\\\"\\\\$begin:math:display$(.*?)\\\\\\\\$end:math:display$\\\"}}`\\n\\nExample:\\n- Input: `{{ extract foo pattern=\\\"(?<=#)(\\\\\\\\w+)(?=#)\\\" }}` with `lead.first_name` = \\\"#John#Doe#Smith\\\"\\n- Output: \\\"John Doe\\\"\\n\\n## Variable Math\\n\\nTo perform math operations, use the `math` helper: `{{ math \\\"1 + 1\\\" }}`\\nresults in `2`. Of course, variables can also be used: `{{ math \\\"1 +\\nlead.random_number\\\" }}` might result in `32` depending on the value\\nof `lead.random_number`. The math expression accepts a pretty basic\\ngrammar. Operators have the normal precedence:\\n\\n| Operator                 | Associativity | Description\\n| ------------------------ | ------------- | ----------\\n| (...)                    | None          | Grouping\\n| f(), x.y                 | Left          | Function call, property access\\n| !                        | Left          | Factorial\\n| ^                        | Right         | Exponentiation\\n| +, -, not, sqrt, etc.    | Right         | Unary prefix operators (see below for the full list)\\n| \\\\*, /, %                 | Left          | Multiplication, division, remainder\\n| +, -, \\\\|\\\\|               | Left          | Addition, subtraction, concatenation\\n| ==, !=, >=, <=, >, <, in | Left          | Equals, not equals, etc. \\\"in\\\" means \\\"is the left operand included in the right array operand?\\\" (disabled by default)\\n| and                      | Left          | Logical AND\\n| or                       | Left          | Logical OR\\n| x ? y : z                | Right         | Ternary conditional (if x then y else z)\\n\\nThere are also several pre-defined functions:\\n\\n| Function      | Description |\\n| ------------- | ----------- |\\n| sin(x)        | Sine of x (x is in radians)\\n| cos(x)        | Cosine of x (x is in radians)\\n| tan(x)        | Tangent of x (x is… well, you know)\\n| asin(x)       | Arc sine of x (in radians)\\n| acos(x)       | Arc cosine of x (in radians)\\n| atan(x)       | Arc tangent of x (in radians)\\n| sqrt(x)       | Square root of x. Result is NaN (Not a Number) if x is negative.\\n| log(x)        | Natural logarithm of x (not base-10). It’s log instead of ln because that’s what JavaScript calls it.\\n| abs(x)        | Absolute value (magnitude) of x\\n| ceil(x)       | Ceiling of x — the smallest integer that’s >= x.\\n| floor(x)      | Floor of x — the largest integer that’s <= x\\n| round(x)      | X, rounded to the nearest integer, using \\\"grade-school rounding\\\"\\n| roundTo(x, n) | Rounds x to n places after the decimal point\\n| exp(x)        | ex (exponential/antilogarithm function with base e)\\n| random(n)     | Get a random number in the range [0, n). If n is zero, or not provided, it defaults to 1.\\n| fac(n)        | n! (factorial of n: “n * (n-1) * (n-2) * … * 2 * 1″)\\n| min(a,b,...)  | Get the smallest (“minimum”) number in the list\\n| max(a,b,...)  | Get the largest (“maximum”) number in the list\\n| pyt(a, b)     | Pythagorean function, i.e. the c in “c2 = a2 + b2“\\n| pow(x, y)     | xy. This is exactly the same as “x^y”. It’s just provided since it’s in the Math object from JavaScript\\n| atan2(y, x)   | arc tangent of x/y. i.e. the angle between (0, 0) and (x, y) in radians\\n| if(c, a, b)   | Function form of c ? a : b\\n\\n#### Example\\n\\nTo calculate the loan-to-value ratio, given a mortgage loan amount and\\nthe value of the home: `{{ math \\\"(lead.mortgage.loan.amount /\\nlead.mortgage.new_property_value) * 100\\\" }}%`. Note that this example\\nexpresses the LTV as a percentage, first by calculating the percentage\\nand then by appending the `%` character outside the variable\\nplaceholder. This could instead be handled using\\n[formatting](#variable-math-formatting).\\n\\n### Variable Math Formatting\\n\\nThe `math` helper supports the same options as the `format` helper for\\nnumbers: `format` and `locale`. For example, to calculate the\\nloan-to-value ratio and format it as a percentage: `{{ math\\n\\\"lead.mortgage.loan.amount / lead.mortgage.new_property_value\\\"\\nformat=\\\"0.[00]%\\\" }}`. This would return the LTV percentage with up to 2\\ndecimal points (i.e. 72.93%) as a string value.\\n\\n## Variable Hashing\\n\\nLeadConduit supports a wide variety of hashing functions that can be\\napplied to variables in a template. The helper name determines the\\nhashing algorithm. For example, to use MD5 to hash the email address use:\\n`{{ md5 lead.email }}`.  All the following hashing algorithms are\\nsupported:\\n  \\n* md4\\n* md5\\n* ripemd\\n* ripemd160\\n* sha1\\n* sha224\\n* sha256\\n* sha384\\n* sha512\\n* whirlpool\\n  \\nMultiple values can be hashed together: `{{ md5 lead.email lead.phone_1 }}`. This can be used to salt the hash \\nalso: `{{ md5 lead.email \\\"this is my salt\\\" }}`. The `salt` option can also be used. This is the equivalent of the \\nlast example: `{{ md5 lead.email salt=\\\"this is my salt\\\" }}`.  \\n\\nHashing supports multiple encodings using the `encoding` option:\\n`{{ md5 lead.email encoding=\\\"base64\\\" }}` results in something like\\n\\\"tkK0IXs0sejTvZFfxlxEUg==\\\". The following encodings are supported:\\n  \\n* `hex` (default)\\n* `base64`\\n* `latin1`\\n\"}],\"externalDocs\":{\"url\":\"https://developers.activeprospect.com/\",\"description\":\"ActiveProspect Developer Portal\"},\"paths\":{\"/account\":{\"get\":{\"summary\":\"Get account\",\"description\":\"Returns the account information of the caller (based on authentication)\",\"operationId\":\"getAccount\",\"tags\":[\"Account\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Account\"}}}}}},\"put\":{\"summary\":\"Update account\",\"description\":\"Update my account information\",\"operationId\":\"updateAccount\",\"tags\":[\"Account\"],\"requestBody\":{\"description\":\"Update an existing Account\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Account\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Account\"}}}}}}},\"/account/prismatic_jwt\":{\"get\":{\"summary\":\"Get a Prismatic marketplace JWT\",\"description\":\"Returns a signed JWT token for authenticating with the Prismatic embedded marketplace. Registers the account with Prismatic if not already registered.\",\"operationId\":\"getPrismaticJwt\",\"tags\":[\"Account\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"token\":{\"type\":[\"string\",\"null\"],\"description\":\"A signed RS256 JWT for Prismatic marketplace authentication\"}}}}}}}}},\"/account_sso_sync\":{\"post\":{\"summary\":\"Sync account data from SSO\",\"description\":\"Syncs account data from SSO using the provided `sso_account_id`.\\n\",\"operationId\":\"accountSSOSync\",\"tags\":[\"Account\"],\"security\":[{\"APIKey\":[]}],\"responses\":{\"200\":{\"description\":\"Session established successfully\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"success\":{\"type\":\"boolean\",\"description\":\"Indicates whether the session was established successfully\",\"example\":true},\"account\":{\"$ref\":\"#/components/schemas/Account\"}},\"required\":[\"success\",\"account\"]}}}},\"400\":{\"description\":\"Bad request - sso_account_id is required\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"example\":\"bad request\"},\"message\":{\"type\":\"string\",\"example\":\"sso_account_id is required\"}}}}}},\"401\":{\"description\":\"Authentication failed. This can occur when:\\n- No API key is provided\\n- An account API key is used instead of a user API key\\n\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"example\":\"user API key required\"},\"message\":{\"type\":\"string\",\"example\":\"This endpoint requires authentication with a user API key, not an account API key\"}}}}}},\"500\":{\"description\":\"Internal server error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"}}}}}}},\"/caps\":{\"get\":{\"summary\":\"List all cap counters\",\"description\":\"Get the counters for all active caps. Caps that haven't received lead traffic during the current interval will not be included.\",\"operationId\":\"listCaps\",\"tags\":[\"Caps and Limits\"],\"parameters\":[{\"in\":\"query\",\"name\":\"flow_id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/cap-counters\"}}}}}}},\"/caps/{id}\":{\"get\":{\"summary\":\"Get a cap counter\",\"description\":\"Returns the cap associated to the ID\",\"operationId\":\"getCap\",\"tags\":[\"Caps and Limits\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the cap to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/cap-counter\"}}}}}}},\"/changelogs\":{\"get\":{\"summary\":\"List all changelogs\",\"description\":\"Get the list of all changelogs.\",\"operationId\":\"listChangelogs\",\"tags\":[\"Changelogs\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Changelogs\"}}}}}}},\"/changelogs/{id}\":{\"get\":{\"summary\":\"Get a changelog\",\"description\":\"Returns the changelog matching the specified ID\",\"operationId\":\"getChangelog\",\"tags\":[\"Changelogs\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the changelog to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Changelog\"}}}}}}},\"/connections/{id}\":{\"get\":{\"summary\":\"Get connection by ID\",\"description\":\"Retrieves a connection by its unique identifier, SSO Connection Id, or Invitation Id. This endpoint allows clients to fetch detailed information about a specific connection.\",\"operationId\":\"getConnectionById\",\"tags\":[\"Connections\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the connection to get. This can be a unique identifier, SSO Connection Id, or Invitation Id.\"}],\"responses\":{\"200\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ConnectionSuccessResponse\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/credentials\":{\"get\":{\"summary\":\"List all credentials\",\"description\":\"Get the list of all credentials.\",\"operationId\":\"listCredentials\",\"tags\":[\"Account\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Credentials\"}}}}}},\"post\":{\"summary\":\"Create a new credential\",\"description\":\"Create a new credential\",\"operationId\":\"createCredential\",\"tags\":[\"Account\"],\"requestBody\":{\"description\":\"Create a new credential\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Credential\"}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Credential\"}}}}}}},\"/credentials/{id}\":{\"get\":{\"summary\":\"Get a credential\",\"description\":\"Returns the credential matching the specified ID\",\"operationId\":\"getCredential\",\"tags\":[\"Account\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the credential to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Credential\"}}}}}},\"put\":{\"summary\":\"Update a credential\",\"description\":\"Update an existing credential matching the specified ID\",\"operationId\":\"updateCredential\",\"tags\":[\"Account\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the credential to update\"}],\"requestBody\":{\"description\":\"Create a new credential\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Credential\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Credential\"}}}}}},\"delete\":{\"summary\":\"Delete a credential\",\"description\":\"Deletes the credential matching the specified ID\",\"operationId\":\"deleteCredential\",\"tags\":[\"Account\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the credential to delete\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Credential\"}}}}}}},\"/destinations\":{\"get\":{\"summary\":\"List all destinations configured for the account\",\"description\":\"The `/destinations` resource is used to query destinations\\nwhich have been configured in the LeadConduit app.\\nIf no destinations are configured for your account, this resource will return an empty array.\\nDestinations returned from this endpoint can be\\n[added to flows](https://developers.activeprospect.com/docs/leadconduit/api/tag/Flows/#tag/Flows/operation/updateFlow).\\n\",\"operationId\":\"listDestinations\",\"tags\":[\"Destinations\",\"Flows\"],\"parameters\":[{\"name\":\"include\",\"in\":\"query\",\"schema\":{\"type\":\"string\",\"enum\":[\"flow_usages\"]},\"description\":\"Additional properties to include in the response.\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Destination\"}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/entities\":{\"get\":{\"summary\":\"List all entities\",\"description\":\"Get the list of all entities.\",\"operationId\":\"listEntities\",\"tags\":[\"Entities\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Entities\"}}}}}},\"post\":{\"summary\":\"Create a new entities\",\"description\":\"Create a new entities\",\"operationId\":\"createEntity\",\"tags\":[\"Entities\"],\"requestBody\":{\"description\":\"Create a new entity\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Entity\"}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Entity\"}}}}}}},\"/entities/{id}\":{\"get\":{\"summary\":\"Get a entity\",\"description\":\"Returns the entity matching the specified ID\",\"operationId\":\"getEntity\",\"tags\":[\"Entities\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the entity to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Entity\"}}}}}},\"put\":{\"summary\":\"Update a entity\",\"description\":\"Update an existing entity matching the specified ID\",\"operationId\":\"updateEntity\",\"tags\":[\"Entities\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the entity to update\"}],\"requestBody\":{\"description\":\"Create a new entity\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Entity\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Entity\"}}}}}},\"delete\":{\"summary\":\"Delete a entity\",\"description\":\"Deletes the entity matching the specified ID\",\"operationId\":\"deleteEntity\",\"tags\":[\"Entities\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the entity to delete\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Entity\"}}}}}}},\"/entities/{id}/changelogs\":{\"get\":{\"summary\":\"List changes to an Entity\",\"description\":\"List all the changes made to an entity\",\"operationId\":\"listEntityChangelogs\",\"tags\":[\"Entities\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the entity\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Changelogs\"}}}}}}},\"/entity_aliases\":{\"get\":{\"summary\":\"List all entity aliases\",\"description\":\"Get the list of all entity aliases for the current account.\",\"operationId\":\"listEntityAliases\",\"tags\":[\"Entities\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/EntityAlias\"}}}}}}},\"post\":{\"summary\":\"Create a new entity alias\",\"description\":\"Create a new entity alias\",\"operationId\":\"createEntityAlias\",\"tags\":[\"Entities\"],\"requestBody\":{\"description\":\"Create a new entity alias\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EntityAlias\"}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EntityAlias\"}}}}}}},\"/entity_aliases/{id}\":{\"get\":{\"summary\":\"Get an entity alias\",\"description\":\"Returns the entity alias matching the specified ID\",\"operationId\":\"getEntityAlias\",\"tags\":[\"Entities\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the entity alias to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EntityAlias\"}}}}}},\"put\":{\"summary\":\"Update an entity alias\",\"description\":\"Update an existing entity alias matching the specified ID\",\"operationId\":\"updateEntityAlias\",\"tags\":[\"Entities\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the entity alias to update\"}],\"requestBody\":{\"description\":\"Update an entity alias\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EntityAlias\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EntityAlias\"}}}}}},\"delete\":{\"summary\":\"Delete an entity alias\",\"description\":\"Deletes the entity alias matching the specified ID\",\"operationId\":\"deleteEntityAlias\",\"tags\":[\"Entities\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the entity alias to delete\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EntityAlias\"}}}}}}},\"/events/event-metrics/median\":{\"get\":{\"summary\":\"Get median event metrics\",\"operationId\":\"getEventMetricsMedian\",\"tags\":[\"Events\"],\"parameters\":[{\"name\":\"max_age\",\"in\":\"query\",\"schema\":{\"type\":\"number\"},\"example\":86400},{\"name\":\"target_property\",\"in\":\"query\",\"schema\":{\"type\":\"string\"}},{\"name\":\"group_by\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},{\"name\":\"timezone\",\"in\":\"query\",\"schema\":{\"type\":\"number\"},\"example\":-18000}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"result\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"type\":{\"type\":\"string\"},\"module_id\":{\"type\":\"string\"},\"median\":{\"type\":\"number\"}}}}}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"429\":{\"description\":\"Reports are temporarily unavailable (Keen query timeout or invalid response).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports are temporarily unavailable\"}}}}}},\"503\":{\"description\":\"Reports service is temporarily unavailable (connection error to analytics provider).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports service is temporarily unavailable\"}}}}}}}}},\"/events/event-metrics/funnel\":{\"get\":{\"summary\":\"Get funnel event metrics\",\"operationId\":\"getEventMetricsFunnel\",\"tags\":[\"Events\"],\"parameters\":[{\"name\":\"timeframe\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-metrics-timeframe\"},\"example\":\"today\"},{\"name\":\"interval\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-metrics-interval\"},\"example\":\"daily\"},{\"name\":\"timezone\",\"in\":\"query\",\"schema\":{\"type\":\"number\"},\"example\":-18000},{\"name\":\"steps\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"steps\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"with_actors\":{\"type\":\"boolean\"},\"actor_property\":{\"type\":\"string\"},\"event_collection\":{\"type\":\"string\"},\"filters\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"operator\":{\"type\":\"string\"},\"property_name\":{\"type\":\"string\"},\"property_value\":{\"type\":\"string\"}}}}},\"additionalProperties\":true}},\"result\":{\"type\":\"array\",\"items\":{\"type\":\"number\"}}}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"429\":{\"description\":\"Reports are temporarily unavailable (Keen query timeout or invalid response).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports are temporarily unavailable\"}}}}}},\"503\":{\"description\":\"Reports service is temporarily unavailable (connection error to analytics provider).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports service is temporarily unavailable\"}}}}}}}}},\"/events/event-metrics/count\":{\"get\":{\"summary\":\"Get event metrics counts\",\"description\":\"Returns event count for the given timeframe and filters (Keen `leadconduit.events`).\\n\\n**Total Events (single scalar):** Use the same `timeframe` and `filters` as the Events list/charts, and omit `group_by` and `interval`. The response is a scalar: `result` is the total event count. With `group_by` and/or `interval`, the response is time-series; sum `result[].value[].result` (and across timeframe buckets) to derive a total.\\n\\n**Unclaimed Certificates count:** To get the count that matches \\\"Unclaimed\\\" rows in the Events table (events with no TrustedForm cert URL and no vars.trustedform), use the same `timeframe` and `filters` as the list plus these two filters:\\n- property_name `vars.lead.trustedform_cert_url`, operator `is blank`\\n- property_name `vars.trustedform`, operator `is blank`\\nThe backend maps \\\"is blank\\\" to Keen operator \\\"exists\\\" with property_value false (property does not exist). The metric card count must match the number of \\\"Unclaimed\\\" rows 1:1.\\n\",\"operationId\":\"getEventMetricsCount\",\"tags\":[\"Events\"],\"parameters\":[{\"name\":\"group_by\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},{\"name\":\"timeframe\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-metrics-timeframe\"},\"example\":\"this_14_days\"},{\"name\":\"interval\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-metrics-interval\"},\"example\":\"daily\"},{\"name\":\"timezone\",\"in\":\"query\",\"schema\":{\"type\":\"number\"},\"example\":-18000},{\"name\":\"filters\",\"in\":\"query\",\"description\":\"Keen-style filters (property_name, operator, property_value). For Unclaimed Certificates count, include property_name `vars.lead.trustedform_cert_url` operator `is blank` and property_name `vars.trustedform` operator `is blank` in addition to the same filters used for the Events list.\\n\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}}],\"responses\":{\"200\":{\"description\":\"OK. When group_by and interval are omitted, result is a scalar number (total count). With group_by/interval, result is an array of value/timeframe objects.\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"result\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"value\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"outcome\":{\"type\":\"string\"},\"result\":{\"type\":\"number\"}}}},\"timeframe\":{\"$ref\":\"#/components/schemas/event-metrics-timeframe-bounded\"}}}}}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"429\":{\"description\":\"Reports are temporarily unavailable (Keen query timeout or invalid response).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports are temporarily unavailable\"}}}}}},\"503\":{\"description\":\"Reports service is temporarily unavailable (connection error to analytics provider).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports service is temporarily unavailable\"}}}}}}}}},\"/events/event-metrics/count_unique\":{\"get\":{\"summary\":\"Get unique event metrics counts\",\"operationId\":\"getEventMetricsCountUnique\",\"tags\":[\"Events\"],\"parameters\":[{\"name\":\"group_by\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},{\"name\":\"timeframe\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-metrics-timeframe\"}},{\"name\":\"interval\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-metrics-interval\"},\"example\":\"daily\"},{\"name\":\"timezone\",\"in\":\"query\",\"schema\":{\"type\":\"number\"},\"example\":-18000},{\"name\":\"filters\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}},{\"name\":\"target_property\",\"in\":\"query\",\"schema\":{\"type\":\"string\"}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"result\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"value\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"outcome\":{\"type\":\"string\"},\"result\":{\"type\":\"number\"}}}},\"timeframe\":{\"$ref\":\"#/components/schemas/event-metrics-timeframe-bounded\"}}}}}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"429\":{\"description\":\"Reports are temporarily unavailable (Keen query timeout or invalid response).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports are temporarily unavailable\"}}}}}},\"503\":{\"description\":\"Reports service is temporarily unavailable (connection error to analytics provider).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports service is temporarily unavailable\"}}}}}}}}},\"/events/event-metrics/select_unique\":{\"get\":{\"summary\":\"Select unique event metrics\",\"operationId\":\"getEventMetricsSelectUnique\",\"tags\":[\"Events\"],\"parameters\":[{\"name\":\"group_by\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},{\"name\":\"timeframe\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-metrics-timeframe\"}},{\"name\":\"interval\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-metrics-interval\"}},{\"name\":\"timezone\",\"in\":\"query\",\"schema\":{\"type\":\"number\"},\"example\":-18000},{\"name\":\"filters\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}},{\"name\":\"target_property\",\"in\":\"query\",\"schema\":{\"type\":\"string\"}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"result\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"vars.source.id\":{\"type\":\"string\"},\"vars.recipient.id\":{\"type\":\"string\"},\"result\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"additionalProperties\":true}}}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"429\":{\"description\":\"Reports are temporarily unavailable (Keen query timeout or invalid response).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports are temporarily unavailable\"}}}}}},\"503\":{\"description\":\"Reports service is temporarily unavailable (connection error to analytics provider).\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"example\":\"Reports service is temporarily unavailable\"}}}}}}}}},\"/events\":{\"get\":{\"summary\":\"List all events\",\"description\":\"The `/events` resource is used to query\\n[events](https://developers.activeprospect.com/docs/leadconduit/api/tag/Leads/#tag/Leads/schema/Event)\\ngenerated while handling leads. For each lead, one event is generated for\\neach configured [flow\\nstep](https://developers.activeprospect.com/docs/leadconduit/api/tag/Flows/#tag/Flows/schema/Flow)\\nthat handles the lead. After lead processing completes, a source event\\nis also recorded.\\n\",\"operationId\":\"listEvents\",\"tags\":[\"Leads\"],\"parameters\":[{\"name\":\"after_id\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"description\":\"Return only events that were created after the one with this ID (exclusive)\"},{\"name\":\"before_id\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"description\":\"Return only events that were created before the one with this ID (exclusive)\"},{\"name\":\"start\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"description\":\"Return only events that were created at or after this time\"},{\"name\":\"end\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"description\":\"Return only events that were created at or before this time\"},{\"name\":\"rules\",\"in\":\"query\",\"schema\":{\"type\":\"string\"},\"description\":\"Stringified array of Rules to select matching events\"},{\"name\":\"include\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"description\":\"An array of fields to include. Cannot be used with exclude.\"},{\"name\":\"exclude\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"description\":\"An array of fields to exclude. Cannot be used with include.\"},{\"name\":\"limit\",\"in\":\"query\",\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"description\":\"The maximum number of events to return (maximum limit is 1000, default 100)\"},{\"name\":\"lead_id\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"description\":\"Return only events associated with this lead ID\"},{\"name\":\"sort\",\"in\":\"query\",\"schema\":{\"type\":\"string\"},\"description\":\"The results are sorted by date. Use asc to sort by oldest first or desc to sort by newest first. Defaults to desc.\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Event\"}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}},\"post\":{\"summary\":\"List all events for exports\",\"description\":\"The `/events` resource is used to query\\n[events](https://developers.activeprospect.com/docs/leadconduit/api/tag/Leads/#tag/Leads/schema/Event)\\ngenerated while handling leads. For each lead, one event is generated for\\neach configured [flow\\nstep](https://developers.activeprospect.com/docs/leadconduit/api/tag/Flows/#tag/Flows/schema/Flow)\\nthat handles the lead. After lead processing completes, a source event\\nis also recorded.\\n\",\"operationId\":\"listEventsPost\",\"tags\":[\"Leads\"],\"requestBody\":{\"description\":\"Query parameters\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EventQuery\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Event\"}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/events/{id}\":{\"get\":{\"summary\":\"Fetch a single event\",\"operationId\":\"getEvent\",\"tags\":[\"Leads\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the event to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Event\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/events/stats\":{\"get\":{\"summary\":\"Retrieve statistics on events\",\"description\":\"The `/events/stats` resource is used to count events. The event count can be grouped by any field collected \\nwith the lead or appended to the lead during flow processing. The API also supports returning results in JSON \\nor CSV using the appropriate MIME type in the `Accept` header.\\n\",\"operationId\":\"eventStatistics\",\"tags\":[\"Leads\",\"Reports\"],\"parameters\":[{\"name\":\"type\",\"in\":\"query\",\"schema\":{\"type\":\"string\"},\"description\":\"Convenience option that specifies a filter on event type (source, recipient, filter, feedback-received, or feedback-sent). Can be used multiple times to specify multiple types. (default: source)\"},{\"name\":\"rule\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/Rule\"},\"description\":\"Limit counted events using this rule. Can be used multiple times to specify multiple rules. Each rule must be sent as URL encoded JSON.\"},{\"name\":\"group_by\",\"in\":\"query\",\"schema\":{\"type\":\"string\"},\"description\":\"Group event counts by unique values of this property. Can be used multiple times to specify multiple properties. (default: none)\"},{\"name\":\"interval\",\"in\":\"query\",\"schema\":{\"type\":\"string\"},\"description\":\"Groups event counts into sub-timeframes spanning a specified length of time: minutely, hourly, daily, weekly, monthly, yearly (default: none)\"},{\"name\":\"timezone\",\"in\":\"query\",\"schema\":{\"type\":\"integer\"},\"description\":\"When an interval is specified, this time zone will be used to set the start and end of each interval. Any tz database time zone name (i.e. America/Chicago) or the number of seconds to offset time from UTC (i.e. -18000)\"},{\"name\":\"start\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"description\":\"Count events that were created at or after this time (default: beginning of the day today)\"},{\"name\":\"end\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"description\":\"Count events that were created at or before this time (default: end of the day today)\"},{\"name\":\"outcome\",\"in\":\"query\",\"schema\":{\"type\":\"string\"},\"description\":\"DEPRECATED: use column instead. The outcome to count (default: success, failure, error). Can be used multiple times to specify multiple types.\"},{\"name\":\"column\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/event-statistic\"},\"description\":\"A column to aggregate. Can be used multiple times to specify multiple columns.  source-success, source-failure, source-error\"},{\"name\":\"by_lead\",\"in\":\"query\",\"schema\":{\"type\":\"boolean\"},\"description\":\"Boolean indicating whether to count unique leads or unique events - false counts individual events (default: true)\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/event-statistics\"}}}}}}},\"/exports\":{\"get\":{\"summary\":\"List all exports\",\"description\":\"Returns the export jobs requested by users in the calling account, newest\\nfirst. The list is filtered to exports whose `expires_at` is in the\\nfuture (i.e. still downloadable). Use the `before_id` cursor and `limit`\\nto paginate; pass the `id` of the last item from the previous page as\\n`before_id` to fetch the next page.\\n\",\"operationId\":\"listExports\",\"tags\":[\"Exports\"],\"parameters\":[{\"name\":\"before_id\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"description\":\"Return only exports created before the one with this ID (exclusive). Used for cursor pagination.\"},{\"name\":\"after_id\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"description\":\"Return only exports created after the one with this ID (exclusive).\"},{\"name\":\"limit\",\"in\":\"query\",\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":100},\"description\":\"The maximum number of exports to return (maximum `limit` is 100).\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Export\"}}}}},\"400\":{\"description\":\"Invalid request parameters.\"},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/fields\":{\"get\":{\"summary\":\"List all fields\",\"description\":\"Get the list of all fields, including all standard and custom fields.\\nOptionally, provide a `flow_id` query parameter to return only the fields\\nreferenced by a specific flow.\\n\",\"operationId\":\"listFields\",\"tags\":[\"Fields\"],\"parameters\":[{\"in\":\"query\",\"name\":\"flow_id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":false,\"description\":\"Optional ID of a flow. When provided, only fields referenced by that flow are returned.\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Field\"}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}},\"post\":{\"summary\":\"Create a field\",\"description\":\"Create a new custom field, adding it to the list of all fields in the\\naccount.\\n\",\"operationId\":\"createField\",\"tags\":[\"Fields\"],\"requestBody\":{\"description\":\"Create a new field\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Field\"}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Field\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/fields/{id}\":{\"get\":{\"summary\":\"Get a field\",\"description\":\"Fetch a single field.\",\"operationId\":\"getField\",\"tags\":[\"Fields\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the field to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Field\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}},\"put\":{\"summary\":\"Update a field\",\"description\":\"Update an existing custom field. Standard fields cannot be updated.\\n\",\"operationId\":\"updateField\",\"tags\":[\"Fields\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the field to update\"}],\"requestBody\":{\"description\":\"Updated an existing field\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Field\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Field\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}},\"delete\":{\"summary\":\"Delete a field\",\"description\":\"Delete an existing custom field. If a field is referenced in a flow and\\nis deleted, an HTTP 202 will be returned but that flow will continue to\\noperate as though the field still exists. The errors for each flow will\\nbe returned to the response body and the recorded on the flow's error\\nproperty. More changes to the flow must dereference the field.\\n\\nStandard fields cannot be deleted.\\n\",\"operationId\":\"deleteField\",\"tags\":[\"Fields\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the field to delete\"}],\"responses\":{\"202\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Field\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/fields/{id}/changelogs\":{\"get\":{\"summary\":\"List changes to a Field\",\"description\":\"Lists all the changes made to a Field\",\"operationId\":\"listFieldChangelogs\",\"tags\":[\"Fields\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID of the Field\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Changelogs\"}}}}}}},\"/firehose\":{\"get\":{\"summary\":\"Test firehose's ability to write to AWS S3 or Azure Blob Storage\",\"description\":\"The `/firehose` resource is used to validate cloud storage credentials and test \\nwrite access to a specified bucket/container.\\n\\n**AWS S3 Validation:**\\n- Creates a test file with unique name `leadconduit_verification_[flow_id_]YYYYMMDDHHMMSSMS.txt`\\n- File location: `<prefix>/filename` (if prefix provided) or `filename` (root of bucket)\\n- Returns S3 putObject response with ETag on success\\n- Can validate credentials without creating file when `verification_file=false`\\n\\n**Azure Blob Storage Validation:**\\n- Validates credentials by checking container existence and access permissions\\n- Optionally creates verification file based on `verification_file` parameter\\n- Returns container validation information on success\\n\\n**Required Parameters:**\\n- For AWS: `access_key_id`, `secret_access_key`, `bucket`\\n- For Azure: `connection_string`, `bucket` (container name)\\n- The `service` parameter determines which validation method is used\\n\\n**Optional Parameters:**\\n- `flow_id`: Include flow ID in verification filename for better tracking\\n- `verification_file`: Control whether verification file is created (default: true)\\n\",\"operationId\":\"firehose\",\"tags\":[\"Firehose\"],\"parameters\":[{\"in\":\"query\",\"name\":\"service\",\"description\":\"Cloud service provider. Defaults to 'aws' if not specified.\",\"schema\":{\"type\":\"string\",\"enum\":[\"aws\",\"azure\"],\"default\":\"aws\"},\"required\":false},{\"in\":\"query\",\"name\":\"access_key_id\",\"description\":\"AWS Access Key ID for S3 authentication. Required when service is 'aws' or not specified.\",\"schema\":{\"type\":\"string\"},\"required\":false},{\"in\":\"query\",\"name\":\"secret_access_key\",\"description\":\"AWS Secret Access Key for S3 authentication. Required when service is 'aws' or not specified.\",\"schema\":{\"type\":\"string\"},\"required\":false},{\"in\":\"query\",\"name\":\"connection_string\",\"description\":\"Azure Storage account connection string for Blob Storage authentication. Required when service is 'azure'.\",\"schema\":{\"type\":\"string\"},\"required\":false,\"example\":\"DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey;EndpointSuffix=core.windows.net\"},{\"in\":\"query\",\"name\":\"bucket\",\"description\":\"Storage container name. For AWS: S3 bucket name. For Azure: Blob Storage container name.\",\"schema\":{\"type\":\"string\",\"pattern\":\"^[a-z0-9]([a-z0-9\\\\-]*[a-z0-9])?$\",\"minLength\":3,\"maxLength\":63},\"required\":true},{\"in\":\"query\",\"name\":\"prefix\",\"description\":\"Optional path prefix for stored files. \\n- For AWS: Files will be stored as `<prefix>/leadconduit_verification_[flow_id_]YYYYMMDDHHMMSSMS.txt`\\n- For Azure: Currently not used in validation but stored for future use\\n\",\"schema\":{\"type\":\"string\"},\"required\":false},{\"in\":\"query\",\"name\":\"flow_id\",\"description\":\"Optional flow identifier to include in verification filename.\\nWhen provided, filename becomes: `leadconduit_verification_{flow_id}_{timestamp}.txt`\\nWhen omitted, filename becomes: `leadconduit_verification_{timestamp}.txt`\\n\",\"schema\":{\"type\":\"string\"},\"required\":false,\"example\":\"507f1f77bcf86cd799439011\"},{\"in\":\"query\",\"name\":\"verification_file\",\"description\":\"Whether to create the verification file during validation.\\n- `true` (default): Creates verification file and validates credentials\\n- `false`: Only validates credentials/permissions without creating file\\nFor AWS: uses headBucket operation instead of putObject when false\\nFor Azure: skips file upload step when false\\n\",\"schema\":{\"type\":\"string\",\"enum\":[\"true\",\"false\"],\"default\":\"true\"},\"required\":false}],\"responses\":{\"200\":{\"description\":\"Credentials validation successful\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"title\":\"Firehose Validation Response\",\"description\":\"Standardized response for both AWS S3 and Azure Blob Storage validation\",\"properties\":{\"validated\":{\"type\":\"boolean\",\"description\":\"Indicates successful credential validation\",\"example\":true},\"verification_file\":{\"type\":\"boolean\",\"description\":\"Indicates whether a verification file was created during validation\"}},\"required\":[\"validated\",\"verification_file\"]},\"examples\":{\"success_with_file\":{\"summary\":\"Validation success with verification file\",\"description\":\"Example response when credentials are valid and verification file is created\",\"value\":{\"validated\":true,\"verification_file\":true}},\"success_without_file\":{\"summary\":\"Validation success without verification file\",\"description\":\"Example response when credentials are valid but no verification file is created (verification_file=false)\",\"value\":{\"validated\":true,\"verification_file\":false}}}}}},\"400\":{\"description\":\"Bad Request - Invalid parameters\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"description\":\"Error message indicating invalid parameters (e.g., invalid container name)\"}}}}}},\"401\":{\"description\":\"Unauthorized - Authentication failed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"description\":\"Authentication error message\"}}}}}},\"404\":{\"description\":\"Not Found - Resource not found\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"description\":\"Error message indicating storage account or container not found\"}}}}}},\"409\":{\"description\":\"Conflict - Resource already exists\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"description\":\"Conflict error message\"}}}}}},\"422\":{\"description\":\"Missing required parameters\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"description\":\"Error message indicating which parameters are missing\"}}}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"description\":\"Internal server error message\"}}}}}}}}},\"/flows\":{\"get\":{\"summary\":\"List all flows\",\"description\":\"Returns all the flows associated to an account\",\"operationId\":\"listFlows\",\"tags\":[\"Flows\"],\"parameters\":[{\"in\":\"query\",\"name\":\"include\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"required\":false,\"description\":\"Optional. List of fields to include in the response. Mutually exclusive with 'exclude'.\\n\"},{\"in\":\"query\",\"name\":\"exclude\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"required\":false,\"description\":\"Optional. List of fields to exclude from the response. Mutually exclusive with 'include'.\\n\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Flow\"}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}},\"post\":{\"summary\":\"Create a new flow\",\"description\":\"Create a new flow, adding it to the list of all flows in the account. The caller may specify an ID for a flow, provided it is a valid BSON ID\",\"operationId\":\"createFlow\",\"tags\":[\"Flows\"],\"requestBody\":{\"description\":\"Create a new flow\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Flow\"}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Flow\"}}}}}},\"put\":{\"summary\":\"Update all flows\",\"description\":\"Update all flows for an account. Only users with superuser access can run this.\",\"operationId\":\"updateFlows\",\"tags\":[\"Flows\"],\"responses\":{\"200\":{\"description\":\"OK\"}}}},\"/flows/{id}\":{\"get\":{\"summary\":\"Get a flow\",\"description\":\"Returns the flow associated to the ID\",\"operationId\":\"getFlow\",\"tags\":[\"Flows\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the flow to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Flow\"}}}}}},\"put\":{\"summary\":\"Update an existing flow\",\"description\":\"Update an existing Flow\",\"operationId\":\"updateFlow\",\"tags\":[\"Flows\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the flow to update\"}],\"requestBody\":{\"description\":\"Update a flow\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Flow\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Flow\"}}}}}},\"delete\":{\"summary\":\"Delete an existing flow\",\"description\":\"Once a flow is deleted it will no longer accept leads. Attempting to submit leads to a deleted flow will result in an HTTP 404. Returns the flow as it existed at the time of deletion.\",\"operationId\":\"deleteFlow\",\"tags\":[\"Flows\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the flow to delete\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Flow\"}}}}}}},\"/flows/{id}/deploy\":{\"post\":{\"summary\":\"Deploy a saved flow to production\",\"description\":\"A flow defines how lead submissions will be handled. In order to make a flow's latest state active for lead handling, it must be deployed. Because changes to a flow can be made without deploying them, you are free make flow updates without affecting current lead handling.  Put another way, a deployment must be performed after it is created or updated in order for lead handling to start using the new configuration.\",\"operationId\":\"deployFlow\",\"tags\":[\"Flows\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID of the flow to deploy\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/DeployResponse\"}}}}}}},\"/flows/{id}/changelogs\":{\"get\":{\"summary\":\"List changes to a Flow\",\"description\":\"Lists all the changes made to a flow\",\"operationId\":\"listFlowChangelogs\",\"tags\":[\"Changelogs\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID of the flow\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Changelogs\"}}}}}}},\"/flows/{id}/fields\":{\"get\":{\"summary\":\"List fields associated to the Flow\",\"description\":\"List fields associated to the Flow\",\"operationId\":\"listFlowFields\",\"tags\":[\"Flows\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID of the flow schema\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Field\"}}}}}}}},\"/flows/{id}/fields/usage\":{\"get\":{\"summary\":\"Get flow field usages\",\"description\":\"Count the number of leads processed by flow field. This tells you which and how much each flow field was used today. You can change the timeframe using the `timeframe` parameter (i.e. `timeframe=previous_30_days`), though this is discouraged because this query is fairly heavy.\",\"operationId\":\"flowFieldUsages\",\"tags\":[\"Flows\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID of the flow\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true},{\"in\":\"query\",\"name\":\"timeframe\",\"schema\":{\"type\":\"string\"}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"integer\"}}}}}}}},\"/flows/{flow_id}/sources/{source_id}/meta\":{\"get\":{\"summary\":\"Retrieve metadata for a specific source within a flow\",\"description\":\"Returns metadata about a source within a specified flow, including parameters, account details, and operational settings.\",\"operationId\":\"getFlowSourceMeta\",\"tags\":[\"Flows\"],\"parameters\":[{\"name\":\"flow_id\",\"in\":\"path\",\"required\":true,\"description\":\"The ID of the flow\",\"schema\":{\"type\":\"string\",\"example\":\"67dc2ec447ba19de15745945\"}},{\"name\":\"source_id\",\"in\":\"path\",\"required\":true,\"description\":\"The ID of the source within the flow\",\"schema\":{\"type\":\"string\",\"example\":\"53a310fa9d29c9c72100006c\"}}],\"responses\":{\"200\":{\"description\":\"Successful response with source metadata\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Meta\"}}}},\"400\":{\"description\":\"Bad request due to invalid flow_id or source_id\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"enum\":[\"Invalid flow_id\",\"Invalid source_id\"]}},\"required\":[\"error\"]},\"examples\":{\"invalid_flow_id\":{\"summary\":\"Invalid flow_id\",\"value\":{\"error\":\"Invalid flow_id\"}},\"invalid_source_id\":{\"summary\":\"Invalid source_id\",\"value\":{\"error\":\"Invalid source_id\"}}}}}},\"404\":{\"description\":\"Flow or source not found\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"enum\":[\"Flow not found\",\"Source has not been added to this flow\"]}},\"required\":[\"message\"]},\"examples\":{\"flow_not_found\":{\"summary\":\"Flow not found\",\"value\":{\"message\":\"Flow not found\"}},\"source_not_found\":{\"summary\":\"Source not found in flow\",\"value\":{\"message\":\"Source has not been added to this flow\"}}}}}}}}},\"/flows/{flow_id}/sources/{source_id}/submit\":{\"post\":{\"summary\":\"Submit data to a source within a flow\",\"description\":\"Submits JSON lead data to a specified source within a flow and returning a success response in JSON.\",\"operationId\":\"submitFlowSourceData\",\"tags\":[\"Flows\"],\"parameters\":[{\"name\":\"flow_id\",\"in\":\"path\",\"required\":true,\"description\":\"The ID of the flow\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"}},{\"name\":\"source_id\",\"in\":\"path\",\"required\":true,\"description\":\"The ID of the source within the flow\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"}}],\"requestBody\":{\"description\":\"The JSON lead data to submit.\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\",\"description\":\"A dynamic set of key-value pairs representing lead data.\"},\"examples\":[{\"email\":\"user@example.com\",\"fname\":\"Example User\"}]}}}},\"responses\":{\"200\":{\"description\":\"A list of metadata records for lead submissions.\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"request\":{\"type\":\"object\",\"description\":\"Details of the lead submission request.\",\"properties\":{\"method\":{\"type\":\"string\",\"description\":\"The HTTP method used for the request (e.g., POST, GET).\",\"example\":\"POST\"},\"uri\":{\"type\":\"string\",\"description\":\"The full URI of the request.\",\"example\":\"https://app.leadconduit-staging.com/flows/12345/sources/67890/submit\"},\"headers\":{\"type\":\"object\",\"description\":\"The headers included in the request.\",\"example\":{\"Accept\":\"application/json\",\"Content-Type\":\"application/x-www-form-urlencoded\"}},\"body\":{\"type\":\"string\",\"description\":\"The request payload containing lead data.\",\"example\":\"email=test@example.com&fname=John\"},\"version\":{\"type\":\"string\",\"description\":\"The HTTP version used in the request.\",\"example\":\"1.1\"},\"timestamp\":{\"type\":\"integer\",\"description\":\"The timestamp of when the request was made.\",\"example\":1742844135024}}},\"response\":{\"type\":\"object\",\"description\":\"Details of the response from the server.\",\"properties\":{\"status\":{\"type\":\"integer\",\"description\":\"The HTTP status code of the response.\",\"example\":201},\"headers\":{\"type\":\"object\",\"description\":\"The headers included in the response.\",\"example\":{\"Content-Type\":\"application/json\",\"Content-Length\":\"72\"}},\"body\":{\"type\":\"string\",\"description\":\"The response body, typically containing lead processing results.\",\"example\":\"{\\\"outcome\\\":\\\"success\\\",\\\"lead\\\":{\\\"id\\\":\\\"abc123\\\"},\\\"price\\\":0}\"}}}}}}}}},\"400\":{\"description\":\"Bad request due to invalid flow_id or source_id\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"enum\":[\"Invalid flow_id\",\"Invalid source_id\"]}},\"required\":[\"error\"]},\"examples\":{\"invalid_flow_id\":{\"summary\":\"Invalid flow_id\",\"value\":{\"error\":\"Invalid flow_id\"}},\"invalid_source_id\":{\"summary\":\"Invalid source_id\",\"value\":{\"error\":\"Invalid source_id\"}}}}}},\"404\":{\"description\":\"Flow or source not found\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"enum\":[\"Flow not found\",\"Source has not been added to this flow\"]}},\"required\":[\"message\"]},\"examples\":{\"flow_not_found\":{\"summary\":\"Flow not found\",\"value\":{\"message\":\"Flow not found\"}},\"source_not_found\":{\"summary\":\"Source not found in flow\",\"value\":{\"message\":\"Source has not been added to this flow\"}}}}}}}}},\"/flows/{flow_id}/sources/{source_id}/test_step\":{\"post\":{\"summary\":\"Test a recipient step integration\",\"description\":\"Runs the full handler middleware pipeline for a single recipient step.\\nProcesses raw inbound data through the source's inbound integration and\\nfield mappings, evaluates acceptance criteria, then sends the mapped data\\nto the recipient step's integration module and returns the outcome.\\nEvents are created during pipeline execution.\\n\\nsubmission_data can be a JSON object (automatically serialized as\\napplication/json) or a raw string paired with a content_type field to\\nsupport any inbound format the source's integration accepts (JSON,\\nform-urlencoded, XML, etc.).\\n\\nIf the recipient integration requires a credential, provide it via the\\noptional step_credential field — either as a credential_id referencing a\\nstored credential, or as an inline credential object for unsaved credentials.\\nGated behind the enable-distribution-step feature flag; returns 404 when\\nthe flag is off.\\n\",\"operationId\":\"testFlowStep\",\"tags\":[\"Flows\"],\"parameters\":[{\"name\":\"flow_id\",\"in\":\"path\",\"required\":true,\"description\":\"The ID of the flow containing the step to test\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"}},{\"name\":\"source_id\",\"in\":\"path\",\"required\":true,\"description\":\"The ID of the source within the flow\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"}}],\"requestBody\":{\"description\":\"The step configuration, inbound submission data (object or raw string with content_type), and optional credential.\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/TestStepRequest\"}}}},\"responses\":{\"200\":{\"description\":\"The integration execution result including outcome and events generated during pipeline processing.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/TestStepResponse\"}}}},\"401\":{\"description\":\"API key authentication failed or was not provided.\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"enum\":[\"authentication failed\"]}},\"required\":[\"error\"]},\"example\":{\"error\":\"authentication failed\"}}}},\"402\":{\"description\":\"Account is unpaid and flow level is not minimal.\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"enum\":[\"Unpaid account\"]}},\"required\":[\"message\"]},\"example\":{\"message\":\"Unpaid account\"}}}},\"404\":{\"description\":\"Feature flag is off (empty body), flow/source not found, or\\ncredential not found (when step_credential.credential_id is provided).\\nWhen the feature flag is off, the response has no body and no JSON content.\\n\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"enum\":[\"Flow not found\",\"Source has not been added to this flow\"]},\"error\":{\"type\":\"string\",\"enum\":[\"Credential not found\"]}}},\"examples\":{\"feature_flag_off\":{\"summary\":\"Feature flag is off\",\"description\":\"No response body is returned\",\"value\":{}},\"flow_not_found\":{\"summary\":\"Flow not found\",\"value\":{\"message\":\"Flow not found\"}},\"source_not_found\":{\"summary\":\"Source not found in flow\",\"value\":{\"message\":\"Source has not been added to this flow\"}},\"credential_not_found\":{\"summary\":\"Credential not found or does not belong to account\",\"value\":{\"error\":\"Credential not found\"}}}}}},\"422\":{\"description\":\"Validation error in request body, integration module not found,\\nor invalid path parameters (flow_id / source_id).\\n\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\"},\"message\":{\"type\":\"string\"},\"errors\":{\"type\":\"object\",\"description\":\"Validation errors keyed by field path, returned when step_config fails flow-level validation.\",\"additionalProperties\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}}},\"examples\":{\"invalid_flow_id\":{\"summary\":\"Invalid flow_id\",\"value\":{\"message\":\"Invalid flow_id\"}},\"invalid_source_id\":{\"summary\":\"Invalid source_id\",\"value\":{\"message\":\"Invalid source_id\"}},\"missing_step_config\":{\"summary\":\"Missing step_config\",\"value\":{\"error\":\"step_config is required\"}},\"missing_integration\":{\"summary\":\"Missing step_config.integration\",\"value\":{\"error\":\"step_config.integration is required\"}},\"missing_module_id\":{\"summary\":\"Missing module_id\",\"value\":{\"error\":\"step_config.integration.module_id is required\"}},\"missing_submission_data\":{\"summary\":\"Missing submission_data\",\"value\":{\"error\":\"submission_data is required\"}},\"empty_submission_data\":{\"summary\":\"Empty string submission_data\",\"value\":{\"error\":\"submission_data must not be empty\"}},\"missing_content_type\":{\"summary\":\"String submission_data without content_type\",\"value\":{\"error\":\"content_type is required when submission_data is a string\"}},\"module_not_found\":{\"summary\":\"Integration module not found\",\"value\":{\"error\":\"Integration module not found: invalid-module\"}},\"missing_handle\":{\"summary\":\"Integration module missing handle function\",\"value\":{\"error\":\"Integration module missing handle function: some-module\"}},\"missing_append_prefix\":{\"summary\":\"Integration module missing appendPrefix\",\"value\":{\"error\":\"Integration module missing appendPrefix: some-module\"}},\"missing_credential\":{\"summary\":\"Credential required but not provided\",\"value\":{\"error\":\"step_credential is required for this integration\"}},\"invalid_credential_type\":{\"summary\":\"step_credential is not an object\",\"value\":{\"error\":\"step_credential must be an object\"}},\"credential_id_extra_fields\":{\"summary\":\"credential_id provided with other fields\",\"value\":{\"error\":\"step_credential must contain only credential_id when referencing a stored credential\"}},\"invalid_credential_id\":{\"summary\":\"credential_id is not a valid ObjectId\",\"value\":{\"error\":\"step_credential.credential_id must be a valid ObjectId\"}},\"validation_failure\":{\"summary\":\"step_config fails flow-level validation\",\"value\":{\"errors\":{\"step_config.rule_set.rules.0.lhv\":[\"must reference a field in this flow\"]}}}}}}}}}},\"/invitations/source\":{\"post\":{\"summary\":\"Create a source invitation\",\"description\":\"Send an invitation to Account's Team and return a source pending entity\",\"operationId\":\"createInvitationSource\",\"tags\":[\"Invitations\"],\"requestBody\":{\"description\":\"Create a new source invitation\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/InvitationRequest\"}}}},\"responses\":{\"200\":{\"description\":\"OK - Invitation already exists, returning existing entity\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/InvitationSuccessResponse\"}}}},\"201\":{\"description\":\"Created - New invitation created, returning a new pending entity\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/InvitationSuccessResponse\"}}}},\"400\":{\"description\":\"Bad request - Invalid parameters\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"example\":{\"status\":400,\"type\":\"Bad Request\",\"title\":\"LCError\",\"detail\":\"Invalid entity ID format\",\"errors\":[{\"pointer\":\"#/entity_id\",\"message\":\"Entity ID must be valid\"}]}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"409\":{\"description\":\"Conflict - A pending invitation already exists for this custom source entity\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"example\":{\"status\":409,\"type\":\"Conflict\",\"title\":\"LCError\",\"detail\":\"A pending invitation already exists for this custom source entity\"}}}},\"422\":{\"description\":\"Unprocessable Entity - Missing required parameters\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"example\":{\"status\":422,\"type\":\"Unprocessable Entity\",\"title\":\"LCError\",\"detail\":\"Missing required parameters\",\"errors\":[{\"pointer\":\"#/email\",\"message\":\"Either email or entity_id is required\"}]}}}}}}},\"/invitations/recipient\":{\"post\":{\"summary\":\"Create a recipient invitation\",\"description\":\"Send an invitation to Account's Team and return a recipient pending entity\",\"operationId\":\"createInvitationRecipient\",\"tags\":[\"Invitations\"],\"requestBody\":{\"description\":\"Create a recipient invitation\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/InvitationRequest\"}}}},\"responses\":{\"200\":{\"description\":\"OK - Invitation already exists, returning existing connected entity\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/InvitationSuccessResponse\"}}}},\"201\":{\"description\":\"Created - New invitation created, returning a new pending entity\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/InvitationSuccessResponse\"}}}},\"400\":{\"description\":\"Bad request - Invalid parameters\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"example\":{\"status\":400,\"type\":\"Bad Request\",\"title\":\"LCError\",\"detail\":\"Invalid entity ID format\",\"errors\":[{\"pointer\":\"#/entity_id\",\"message\":\"Entity ID must be valid\"}]}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"422\":{\"description\":\"Unprocessable Entity - Missing required parameters\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"example\":{\"status\":422,\"type\":\"Unprocessable Entity\",\"title\":\"LCError\",\"detail\":\"Missing required parameters\",\"errors\":[{\"pointer\":\"#/email\",\"message\":\"Either email or entity_id is required\"}]}}}}}}},\"/invitations/{entityId}/resend\":{\"put\":{\"summary\":\"Resend an invitation\",\"description\":\"Resend an expired invitation. Updates the expiration date and resets the invitation status. Works for both source and recipient invitations.\",\"operationId\":\"resendInvitation\",\"tags\":[\"Invitations\"],\"parameters\":[{\"name\":\"entityId\",\"in\":\"path\",\"required\":true,\"description\":\"The ID of the expired entity\",\"schema\":{\"type\":\"string\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7a8\"}}],\"responses\":{\"200\":{\"description\":\"OK - Invitation resent successfully\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/InvitationSuccessResponse\"}}}},\"400\":{\"description\":\"Bad request - Invalid parameters or invitation not expired\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"example\":{\"status\":400,\"type\":\"Bad Request\",\"title\":\"LCError\",\"detail\":\"Entity is not pending or expired\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"404\":{\"description\":\"Entity not found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"}}}}}}},\"/onboards\":{\"get\":{\"summary\":\"List all onboards\",\"description\":\"Returns all the onboard records for the authenticated account. Onboards track the status of buyer connection setup processes.\",\"operationId\":\"listOnboards\",\"tags\":[\"Onboards\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Onboard\"}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}},\"post\":{\"summary\":\"Create a new onboard\",\"description\":\"Creates a new onboard record to track a buyer connection setup process. Requires an invitation_id which will be used to retrieve the associated connection.\",\"operationId\":\"createOnboard\",\"tags\":[\"Onboards\"],\"requestBody\":{\"description\":\"Create a new onboard\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OnboardCreateRequest\"},\"example\":{\"invitation_id\":\"64b8f0f5e4b0c3a1d5e6f7a8\"}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Onboard\"}}}},\"400\":{\"description\":\"Bad request - Invalid parameters or onboard already exists\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\"}}},\"examples\":{\"invalid_invitation\":{\"summary\":\"Invalid invitation ID format\",\"value\":{\"message\":\"Failed to get invitation by id\"}},\"already_exists\":{\"summary\":\"Onboard already exists for this invitation\",\"value\":{\"message\":\"Onboard already exists for this invitation\"}}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"422\":{\"description\":\"Unprocessable entity - Validation error\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"errors\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}}},\"example\":{\"errors\":{\"invitation_id\":[\"Invitation ID is required\"]}}}}},\"500\":{\"description\":\"Internal server error\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\"}}},\"example\":{\"message\":\"Failed to get existing onboard by invitation id\"}}}}}}},\"/onboards/{id}\":{\"get\":{\"summary\":\"Get an onboard\",\"description\":\"Returns the onboard record associated with the given ID\",\"operationId\":\"getOnboard\",\"tags\":[\"Onboards\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the onboard to get\"}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Onboard\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"404\":{\"description\":\"Onboard not found\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\"}}},\"example\":{\"message\":\"Onboard not found\"}}}}}},\"put\":{\"summary\":\"Update an existing onboard\",\"description\":\"Updates an existing onboard record. When the status is set to `completed`, the backend automatically triggers the buyer delivery setup process by calling the `/onboard/buyer` endpoint internally. This will:\\n\\n1. Find the seller account and their flows that deliver to this buyer\\n2. Update or create a buyer flow with the seller as a source\\n3. Update seller flows with the buyer's flow_id mapping\\n4. Send notification emails to seller account users\\n5. Mark the connection as having buyer delivery setup complete\\n\\n**Important:** Ensure all required fields (invitation_id, connection_id) are properly set before marking the onboard as completed.\\n\",\"operationId\":\"updateOnboard\",\"tags\":[\"Onboards\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the onboard to update\"}],\"requestBody\":{\"description\":\"Update an onboard\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Onboard\"}}}},\"responses\":{\"200\":{\"description\":\"OK - Onboard updated successfully. If status is set to 'completed', the backend will automatically trigger the buyer delivery setup process.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Onboard\"}}}},\"400\":{\"description\":\"Bad request - Invalid parameters\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\"}}},\"example\":{\"message\":\"Failed to validate invitation id\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"404\":{\"description\":\"Onboard not found\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\"}}},\"example\":{\"message\":\"Onboard not found\"}}}},\"409\":{\"description\":\"Conflict - Onboard was not updated\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\"}}},\"example\":{\"message\":\"Onboard was not updated\"}}}}}}},\"/onboard/buyer\":{\"post\":{\"summary\":\"Complete buyer delivery setup\",\"description\":\"Completes the buyer delivery setup process for a connection. This endpoint performs several operations:\\n\\n1. Validates the connection_id or resolves it from invitation_id\\n2. Finds the seller account and their flows that deliver to this buyer\\n3. Updates or creates a buyer flow with the seller as a source\\n4. Updates seller flows with the buyer's flow_id mapping\\n5. Sends notification emails to seller account users\\n6. Marks the connection as having buyer delivery setup complete\\n\\n**Note:** Either `connection_id` or `invitation_id` must be provided.\\n\\n**Version Note:**\\n- In the first version of the onboarding modal, this endpoint is called directly by the frontend.\\n- In the second version, this endpoint will be called automatically by the backend when the onboard status changes to `completed_flows_sync`.\\n\",\"operationId\":\"completeOnboardBuyer\",\"tags\":[\"Onboards\"],\"requestBody\":{\"description\":\"Buyer setup request\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OnboardBuyerRequest\"},\"examples\":{\"with_invitation_id_and_flow\":{\"summary\":\"Using invitation_id with flow_id\",\"value\":{\"invitation_id\":\"64b8f0f5e4b0c3a1d5e6f7a9\",\"flow_id\":\"64b8f0f5e4b0c3a1d5e6f7aa\"}},\"with_invitation_id\":{\"summary\":\"Using invitation_id only\",\"value\":{\"invitation_id\":\"64b8f0f5e4b0c3a1d5e6f7a9\"}},\"with_connection_id\":{\"summary\":\"Using connection_id\",\"value\":{\"connection_id\":\"64b8f0f5e4b0c3a1d5e6f7a8\"}},\"with_connection_id_and_flow\":{\"summary\":\"Using connection_id with flow_id\",\"value\":{\"connection_id\":\"64b8f0f5e4b0c3a1d5e6f7a8\",\"flow_id\":\"64b8f0f5e4b0c3a1d5e6f7aa\"}}}}}},\"responses\":{\"200\":{\"description\":\"OK - Buyer setup completed successfully\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OnboardBuyerResponse\"},\"examples\":{\"redirect_to_flow\":{\"summary\":\"Redirect to buyer flow\",\"value\":{\"redirect\":\"/flows/64b8f0f5e4b0c3a1d5e6f7a8\"}},\"redirect_to_destinations\":{\"summary\":\"Redirect for partner-only accounts\",\"value\":{\"redirect\":\"/destinations\"}}}}}},\"400\":{\"description\":\"Bad request - Invalid parameters or setup already complete\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"examples\":{\"invalid_connection\":{\"summary\":\"Invalid connection_id\",\"value\":{\"status\":400,\"type\":\"Bad Request\",\"title\":\"LCError\",\"detail\":\"Invalid request body\",\"errors\":[{\"pointer\":\"#/connection_id\",\"message\":\"Invalid connection_id\"}]}},\"already_setup\":{\"summary\":\"Already setup\",\"value\":{\"status\":400,\"type\":\"Bad Request\",\"title\":\"LCError\",\"detail\":\"Buyer delivery already setup\",\"errors\":[]}},\"invitation_not_accepted\":{\"summary\":\"Invitation not accepted\",\"value\":{\"status\":400,\"type\":\"Bad Request\",\"title\":\"LCError\",\"detail\":\"Invitation not accepted yet\",\"errors\":[]}},\"invalid_connection_type\":{\"summary\":\"Invalid connection type\",\"value\":{\"status\":400,\"type\":\"Bad Request\",\"title\":\"LCError\",\"detail\":\"Invalid Connection Type\",\"errors\":[]}}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}},\"404\":{\"description\":\"Not found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"examples\":{\"connection_not_found\":{\"summary\":\"Connection not found\",\"value\":{\"status\":404,\"type\":\"Not Found\",\"title\":\"LCError\",\"detail\":\"Connection not found\",\"errors\":[]}},\"invitation_not_found\":{\"summary\":\"Invitation not found\",\"value\":{\"status\":404,\"type\":\"Not Found\",\"title\":\"LCError\",\"detail\":\"Invitation not found\",\"errors\":[]}},\"seller_not_found\":{\"summary\":\"Seller account not found\",\"value\":{\"status\":404,\"type\":\"Not Found\",\"title\":\"LCError\",\"detail\":\"Seller account not found for the connection\",\"errors\":[]}},\"buyer_flow_not_found\":{\"summary\":\"Buyer flow not found\",\"value\":{\"status\":404,\"type\":\"Not Found\",\"title\":\"LCError\",\"detail\":\"Buyer flow not found\",\"errors\":[]}}}}}},\"500\":{\"description\":\"Internal server error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LCError\"},\"example\":{\"status\":500,\"type\":\"Internal Server Error\",\"title\":\"LCError\",\"detail\":\"Failed to update the buyer flow\",\"errors\":[]}}}}}}},\"/packages\":{\"get\":{\"summary\":\"List all integration packages\",\"description\":\"Get the list of all integration packages.\",\"operationId\":\"listPackages\",\"tags\":[\"Packages\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/IntegrationPackage\"}}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/packages/{id}\":{\"get\":{\"summary\":\"Fetch a single integration package\",\"description\":\"Fetch a single integration package.\",\"operationId\":\"getPackage\",\"tags\":[\"Packages\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID of the package\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/IntegrationPackage\"}}}},\"401\":{\"description\":\"Authorization information is missing or invalid.\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/NotAuthorized\"}}}}}}},\"/ping_limits\":{\"get\":{\"summary\":\"List all ping limit counters\",\"description\":\"Get the counters for all active ping limits. Ping limits that haven't\\nreceived ping traffic during the current interval will not be included.\\n\",\"operationId\":\"listPingLimits\",\"tags\":[\"Caps and Limits\"],\"parameters\":[{\"in\":\"query\",\"name\":\"flow_id\",\"description\":\"Return the ping limits where `flow_id` matches this value\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/PingLimit\"}}}}}}}},\"/ping_limits/{id}\":{\"get\":{\"summary\":\"Fetch a ping limit counter\",\"description\":\"Get a counter for a single ping limit.\",\"operationId\":\"getPingLimits\",\"tags\":[\"Caps and Limits\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"The ID of the specific Ping Limit\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/PingLimit\"}}}}}}},\"/reports\":{\"get\":{\"summary\":\"List all reports\",\"description\":\"Get the list of all reports.\",\"operationId\":\"listReports\",\"tags\":[\"Reports\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Report\"}}}}}}},\"post\":{\"summary\":\"Create a new report\",\"description\":\"Create a new report, adding it to the list of all reports in the account.\",\"operationId\":\"createReport\",\"tags\":[\"Reports\"],\"requestBody\":{\"description\":\"Create a new Report\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Report\"}}}},\"responses\":{\"201\":{\"description\":\"created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Report\"}}}}}}},\"/reports/{id}\":{\"get\":{\"summary\":\"Fetch a single report\",\"description\":\"Get the report definition for an individual report. The parameter can be\\na report id, which requires passing the api_key or a report token, which\\ndoes not.\\n\",\"operationId\":\"getReport\",\"tags\":[\"Reports\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID or token of the report to fetch\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Report\"}}}}}},\"put\":{\"summary\":\"Update an existing report\",\"description\":\"Update an existing report. Note that the token cannot be updated with\\nthis call. Use the /share endpoint to generate a new token and `/unshare`\\nto clear it.\\n\",\"operationId\":\"updateReport\",\"tags\":[\"Reports\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID or token of the report to fetch\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"requestBody\":{\"description\":\"Update an existing report\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Report\"}}}},\"responses\":{\"200\":{\"description\":\"created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Report\"}}}}}},\"delete\":{\"summary\":\"Delete a report\",\"description\":\"Delete an existing report.\",\"operationId\":\"deleteReport\",\"tags\":[\"Reports\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID or token of the report to delete\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Report\"}}}}}}},\"/reports/{id}/share\":{\"put\":{\"summary\":\"Fetch a report's token\",\"description\":\"Share a report by generating a new token for a report. Once the token is\\nretrieved, you can use it in place of the ID in the `/reports/:id`\\nendpoint.\\n\",\"operationId\":\"shareReport\",\"tags\":[\"Reports\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID of the report to share\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"token\":{\"type\":\"string\"}}}}}}}}},\"/reports/{id}/unshare\":{\"put\":{\"summary\":\"Clear's a reports share token\",\"description\":\"Unshare a report by clearing the report's token.\",\"operationId\":\"unshareReport\",\"tags\":[\"Reports\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID of the report to unshare\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"token\":{\"type\":\"null\"}}}}}}}}},\"/reports/preview\":{\"post\":{\"summary\":\"Create a report without saving it\",\"description\":\"Create a report but don't save it. The report definition is provided in\\nthe post body and the time range is provided as query parameters.\\n\",\"operationId\":\"previewReport\",\"tags\":[\"Reports\"],\"parameters\":[{\"in\":\"query\",\"name\":\"start\",\"description\":\"limit events counted in report to those recorded at or after this time\\n\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"required\":true},{\"in\":\"query\",\"name\":\"end\",\"description\":\"limit events counted in report to those recorded at or before this\\ntime\\n\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"required\":true},{\"in\":\"query\",\"name\":\"columns\",\"description\":\"Array of report columns to display\",\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/report-column\"}},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Report\"}}}}}}}},\"/reports/{id}/run\":{\"get\":{\"summary\":\"Run a report\",\"description\":\"Run a report that was previously created. The parameter can be an id or\\ntoken. The time range is provided as query parameters.\\n\",\"operationId\":\"runReport\",\"tags\":[\"Reports\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"ID or token of the report to run\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true},{\"in\":\"query\",\"name\":\"start\",\"description\":\"limit events counted in report to those recorded at or after this time\\n\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"required\":true},{\"in\":\"query\",\"name\":\"end\",\"description\":\"limit events counted in report to those recorded at or before this\\ntime\\n\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Report\"}}}}}}}},\"/reports/{token}/meta\":{\"get\":{\"summary\":\"Get report metadata\",\"description\":\"Get the metadata for a report that was shared.\",\"operationId\":\"getReportMeta\",\"tags\":[\"Reports\"],\"parameters\":[{\"in\":\"path\",\"name\":\"token\",\"description\":\"Token of the report to retrieve metadata for\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"token\":{\"type\":\"string\"},\"account_name\":{\"type\":\"string\"},\"vars\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"flows\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"entities\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}}}}}}}}},\"/resource_exists\":{\"get\":{\"operationId\":\"getResourceExists\",\"summary\":\"Check if a resource exists and determine ownership status\",\"description\":\"Check if a resource exists and determine the ownership status relative to the current user.\\nThis endpoint requires superuser privileges.\\n\",\"tags\":[\"Resources\"],\"parameters\":[{\"name\":\"resource_type\",\"in\":\"query\",\"required\":true,\"description\":\"The type of resource to check (e.g., flows, events, sources, entities)\",\"schema\":{\"type\":\"string\",\"example\":\"flows\"}},{\"name\":\"resource_id\",\"in\":\"query\",\"required\":true,\"description\":\"The ID of the resource to check\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"}}],\"responses\":{\"200\":{\"description\":\"Resource exists and ownership status determined\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"exists\":{\"type\":\"string\",\"enum\":[\"owned\",\"available\",\"exists\"],\"description\":\"The ownership status of the resource:\\n- `owned`: Resource belongs to the current account\\n- `available`: Resource belongs to an account the user has access to\\n- `exists`: Resource exists but belongs to an account the user doesn't have access to\\n\"},\"owner_account\":{\"type\":\"object\",\"description\":\"Information about the account that owns the resource\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\",\"description\":\"The SSO ID of the account that owns the resource\"},\"name\":{\"type\":\"string\",\"description\":\"The account name\"}}}},\"required\":[\"exists\"]}}}},\"400\":{\"description\":\"Bad request - missing required parameters\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"example\":\"resource_type and resource_id are required\"}},\"required\":[\"error\"]}}}},\"403\":{\"description\":\"Forbidden - user is not a superuser\"},\"404\":{\"description\":\"Resource not found or invalid resource type/ID\"},\"500\":{\"description\":\"Internal server error\"}}}},\"/routers\":{\"get\":{\"summary\":\"List all routers\",\"description\":\"Get the list of all routers.\",\"operationId\":\"listRouters\",\"tags\":[\"Routers\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Router\"}}}}}}},\"post\":{\"summary\":\"Create a router\",\"description\":\"Create a new custom router, adding it to the list of all routers in the\\naccount.\\n\",\"operationId\":\"createRouter\",\"tags\":[\"Routers\"],\"requestBody\":{\"description\":\"Create a new Router\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Router\"}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Router\"}}}}}}}},\"/routers/{id}\":{\"get\":{\"summary\":\"Get a router\",\"description\":\"Fetch a single router.\",\"operationId\":\"getRouter\",\"tags\":[\"Routers\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"The ID of the router\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Router\"}}}}}},\"put\":{\"summary\":\"Update a router\",\"description\":\"Update an existing custom router. Standard routers cannot be updated.\\n\",\"operationId\":\"updateRouter\",\"tags\":[\"Routers\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"The ID of the router\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"requestBody\":{\"description\":\"Update an existing Router\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Router\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Router\"}}}}}}}},\"/search/leads\":{\"get\":{\"summary\":\"Search leads\",\"description\":\"The `/search/leads` resource is used to find leads using full text\\nsearch. For example, you can search for `fred` in `texas` using:\\n\\n```\\n/search/leads?query=fred+tx\\n```\\n\\n## Search Criteria\\n\\n* pass in the search text using the query parameter:\\n  `/search/leads?query=fred`\\n* the query parameter should be URL encoded\\n* searching is case-insensitive: `FRED` and `fred` will both match `Fred`\\n* you don't have to enter a complete word - searching will match the\\n  beginning of words: `/search/leads?query=sam` will match `sam` and\\n  `samantha`\\n* queries with multiple words like `fred tx` will match leads that have\\n  both `fred` AND `tx`\\n* to specify an exact phrase (with spaces), use double quotes - `\\\"fred\\n  tx\\\"` will only match that exact text\\n\\nThe search results can be sorted and paginated. There are two query\\nparameter to control sorting: `sort_by` and `sort_dir`. The `sort_by`\\nparameter takes a field name (see list below) and `sort_dir` is ascending\\n(`asc`) or descending (`desc`). By default, the results are sorted by\\nrelevance.\\n\\nThere are two query parameters to control paging: `from` and `limit`. The\\n`from` parameter specifies the starting offset of that page in the search\\nresults and the `limit` parameter specifies how many search results to\\nreturn. From is zero-based so to get the first 10 results, use\\n`from=0&limit=10`, the second 10 using `from=10&limit=10`, etc... The\\nmaximum `limit` is 100 at a time, with an overall maximum of 1,000 search\\nresults.\\n\\n## Search Results\\n\\nThe search results has the total number of matching leads and an array of\\nhits, where each hit is a matching Lead Search Result. Each lead search\\nresult contains basic information about the lead, the latest event for\\nthat lead, and highlighting of the matched text.\\n\",\"operationId\":\"leadSearch\",\"tags\":[\"Leads\"],\"parameters\":[{\"in\":\"query\",\"name\":\"query\",\"description\":\"text to search for\",\"schema\":{\"type\":\"string\"}},{\"in\":\"query\",\"name\":\"sort_by\",\"description\":\"One of the following field names: `lead_id`, `submission_timestamp`,\\n`first_name`, `last_name`, `email`, `phone_1`, `phone_2`,\\n`address_1`, `city`, `state`, `postal_code`, `reference`\\n\",\"schema\":{\"type\":\"string\",\"enum\":[\"lead_id\",\"submission_timestamp\",\"first_name\",\"last_name\",\"email\",\"phone_1\",\"phone_2\",\"address_1\",\"city\",\"state\",\"postal_code\",\"reference\"]}},{\"in\":\"query\",\"name\":\"sort_dir\",\"description\":\"The sort direction: \\\"asc\\\" or \\\"desc\\\", default is by relevance\\n\",\"schema\":{\"type\":\"string\",\"enum\":[\"asc\",\"desc\"]}},{\"in\":\"query\",\"name\":\"from\",\"description\":\"The starting offset of leads to return in the matching result set,\\nzero-based\\n\",\"schema\":{\"type\":\"integer\"}},{\"in\":\"query\",\"name\":\"limit\",\"description\":\"The maximum number of leads to return (maximum is 100, default is 10)\\n\",\"schema\":{\"type\":\"integer\"}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"hits\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/lead-search-result\"}},\"total\":{\"type\":\"number\"}}}}}}}}},\"/services\":{\"get\":{\"summary\":\"Get Pricing Services\",\"description\":\"Returns a list of configured pricing services.\\n\",\"operationId\":\"listServices\",\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/PricingService\"}}}}}}}},\"/status\":{\"get\":{\"summary\":\"Get system status\",\"description\":\"Shows the general status of the system\",\"operationId\":\"status\",\"tags\":[\"System\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Status\"}}}}}}},\"/submission_doc_access_logs\":{\"get\":{\"summary\":\"Returns the list of submission docs from other accounts accessed by an account's users.\",\"description\":\"A record is created when users access submission docs for accounts outside of their own. This endpoint retrieves a list of those records where visibility is not blocked in the database (field 'hidden' equal to true). To fetch all records, including those marked as hidden, the query parameter `show_hidden` can be passed with a value of true.\",\"operationId\":\"listSubmissionDocAccessLogs\",\"tags\":[\"SubmissionDocAccessLogs\"],\"parameters\":[{\"in\":\"query\",\"name\":\"show_hidden\",\"schema\":{\"type\":\"boolean\"}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/SubmissionDocAccessLogs\"}}}}}},\"post\":{\"summary\":\"Create a submission doc access log\",\"description\":\"Create a submission doc access log for a specific flow and source\",\"operationId\":\"createSubmissionDocAccessLog\",\"tags\":[\"SubmissionDocAccessLogs\"],\"requestBody\":{\"description\":\"Flow and Source IDs of the submission doc being accessed\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"flow_id\":{\"$ref\":\"#/components/schemas/ID\"},\"source_id\":{\"$ref\":\"#/components/schemas/ID\"}}}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/SubmissionDocAccessLog\"}}}},\"202\":{\"description\":\"Submission doc access log not created. This will happen if the submission doc is being accessed by the same account, the source has been removed from the flow, or if the flow ID provided does not exist.\"},\"400\":{\"description\":\"Body must include \\\"flow_id\\\" and \\\"source_id\\\" and both must be valid ObjectId strings\"}}}},\"/submission_doc_access_logs/account/{account_id}\":{\"put\":{\"summary\":\"Set submission docs access logs visibility for all docs associated with a specific account\",\"description\":\"Set the property `hidden` for one or more submission docs access logs. This endpoint updates the `hidden` property with the value provided in the request body for the docs whose flow belongs to the account with the ID passed in the path parameter.\",\"operationId\":\"updateSubmissionDocsAccessLogsForAccount\",\"tags\":[\"SubmissionDocAccessLogs\"],\"parameters\":[{\"in\":\"path\",\"name\":\"account_id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the account to update the submission docs\"}],\"requestBody\":{\"description\":\"Flag do define if a submission doc access log will be retrieved by the query endpoint\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/UpdateSubmissionDocsAccessLogsVisibility\"}}}},\"responses\":{\"200\":{\"description\":\"OK\"},\"400\":{\"description\":\"Missing mandatory body field \\\"hidden\\\" with type \\\"boolean\\\"\"}}}},\"/submission_doc_access_logs/flow/{flow_id}\":{\"put\":{\"summary\":\"Set submission docs access logs visibility for all docs associated with a specific flow\",\"description\":\"Set the property `hidden` for all submission docs access logs belonging to the flow with the given ID. This endpoint updates the `hidden` property with the value provided in the request body for all docs associated with the specified flow ID.\",\"operationId\":\"updateSubmissionDocsAccessLogsForFlow\",\"tags\":[\"SubmissionDocAccessLogs\"],\"parameters\":[{\"in\":\"path\",\"name\":\"flow_id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the flow to update the submission docs\"}],\"requestBody\":{\"description\":\"Flag do define if a submission doc access log will be retrieved by the query endpoint\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/UpdateSubmissionDocsAccessLogsVisibility\"}}}},\"responses\":{\"200\":{\"description\":\"OK\"},\"400\":{\"description\":\"Missing mandatory body field \\\"hidden\\\" with type \\\"boolean\\\"\"}}}},\"/submission_doc_access_logs/flow/{flow_id}/source/{source_id}\":{\"put\":{\"summary\":\"Set submission docs access logs visibility for one doc associated with a specific flow and source\",\"description\":\"Set the property `hidden` for a submission doc access log belonging to both the flow and source with the given IDs. This endpoint updates the `hidden` property with the value provided in the request body for all docs associated with the specified flow and source IDs.\",\"operationId\":\"updateSubmissionDocsAccessLogsForFlowAndSource\",\"tags\":[\"SubmissionDocAccessLogs\"],\"parameters\":[{\"in\":\"path\",\"name\":\"flow_id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the flow to update the submission docs\"},{\"in\":\"path\",\"name\":\"source_id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the source to update the submission docs\"}],\"requestBody\":{\"description\":\"Flag do define if a submission doc access log will be retrieved by the query endpoint\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/UpdateSubmissionDocsAccessLogsVisibility\"}}}},\"responses\":{\"200\":{\"description\":\"OK\"},\"400\":{\"description\":\"Missing mandatory body field \\\"hidden\\\" with type \\\"boolean\\\"\"}}}},\"/types\":{\"get\":{\"summary\":\"List data types\",\"description\":\"Lists the data [types](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/) available for fields or vars\",\"operationId\":\"listTypes\",\"tags\":[\"Fields\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"items\":{\"$ref\":\"#/components/schemas/Type\"}}}}}}}},\"/user\":{\"get\":{\"summary\":\"Get user\",\"description\":\"This singleton resource returns the currently authenticated user\",\"operationId\":\"getAuthenticatedUser\",\"tags\":[\"Account\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/AuthenticatedUser\"}}}}}}},\"/user/{id}\":{\"put\":{\"summary\":\"Update user\",\"description\":\"Resource for User or user admin to toggle modal flag\",\"operationId\":\"updateUser\",\"tags\":[\"Account\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true,\"description\":\"ID of the user to update\"}],\"requestBody\":{\"description\":\"UI State flags are passed as boolean values. Response will return the flag as a date-time string or null value\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/UserUpdate\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/AuthenticatedUser\"}}}}}}},\"/user_settings\":{\"post\":{\"summary\":\"Create user settings\",\"description\":\"Create a new user settings document, adding it to the list of all user settings in the\\naccount.\\n\",\"operationId\":\"createUserSettings\",\"tags\":[\"Account\"],\"requestBody\":{\"description\":\"Create a new User Settings\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/UserSettings\"}}}},\"responses\":{\"201\":{\"description\":\"Created\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/UserSettings\"}}}}}}},\"/user_settings/{id}\":{\"get\":{\"summary\":\"Get a user settings\",\"description\":\"Fetch a single user settings document.\",\"operationId\":\"getUserSettings\",\"tags\":[\"Account\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"The ID of the user\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/UserSettings\"}}}}}},\"put\":{\"summary\":\"Update a user settings\",\"description\":\"Update an existing user settings document.\\n\",\"operationId\":\"updateUserSettings\",\"tags\":[\"Account\"],\"parameters\":[{\"in\":\"path\",\"name\":\"id\",\"description\":\"The ID of the user settings\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"},\"required\":true}],\"requestBody\":{\"description\":\"Update an existing User Settings\",\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/UserSettings\"}}}},\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/UserSettings\"}}}}}}}},\"/vars\":{\"get\":{\"summary\":\"List variables\",\"description\":\"The `/vars` resource is used to identify which data points have been\\ncollected in your flows. This resource is used to determine which data\\npoints are available for exports and stats queries.\\n\\nAs a lead is processed by a flow, a variable for every field value and\\nevery piece of appended data is created. If the variable for a data point\\nalready exists, a new one is not created. That is to say that there will\\nonly ever be one `lead.email` variable. Each time an email address is\\ncollected, the `last_seen_at` timestamp is updated.\\n\",\"operationId\":\"vars\",\"tags\":[\"Fields\"],\"parameters\":[{\"in\":\"query\",\"name\":\"flow_id\",\"description\":\"Return only variables where the flow ID matches this value (multiple\\n`flow_id` parameters may be used to select variables across several\\nspecific flows)\\n\",\"schema\":{\"$ref\":\"#/components/schemas/ID\"}},{\"name\":\"start\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"description\":\"Return only variables seen at or after this time\"},{\"name\":\"end\",\"in\":\"query\",\"schema\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"description\":\"Return only variables created at or before this time\"},{\"name\":\"exclude\",\"in\":\"query\",\"schema\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Var\"}}}}}}}},\"/version/ui\":{\"get\":{\"summary\":\"Get UI app version\",\"description\":\"Returns the current UI app version.\",\"operationId\":\"versionUi\",\"tags\":[\"System\"],\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/VersionUi\"}}}}}}}},\"components\":{\"securitySchemes\":{\"APIKey\":{\"type\":\"http\",\"scheme\":\"basic\",\"description\":\"LeadConduit uses [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication)\\nwith the username `API` and your API key as the password.\\n\\nFor example: `API:1f1b96c9150d8050e858c043d543bb4eadae0e6f`'\\n\"}},\"schemas\":{\"acceptance-criteria\":{\"title\":\"Acceptance Criteria\",\"type\":\"object\",\"properties\":{\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\",\"description\":\"This rule set must pass in order for a lead to be accepted\"},\"outcome\":{\"type\":\"string\",\"description\":\"When the rule set fails, `success`, `failure` or `error` is returned to the source that submitted the lead\",\"enum\":[\"success\",\"failure\",\"error\"],\"example\":\"failure\"},\"reason\":{\"$ref\":\"#/components/schemas/Template\",\"description\":\"When the outcome is `failure`, this is the reason to provide to the source\",\"example\":\"Lead must live in TX\",\"type\":\"string\"}},\"additionalProperties\":false,\"required\":[\"outcome\",\"rule_set\"],\"description\":\"Acceptance criteria specifies the kinds of leads that a source or sources must provide in a flow. Acceptance criteria can be configured at both a flow level and a source level. When a source submits a lead, the flow-level acceptance criteria rule set is evaluated first, then any source-level acceptance criteria. If the rule sets pass, then the lead is allowed to progress on in the flow. But if either rule set fails, then the source is immediately given a response and no further processing takes place in the flow for that lead.\\n\"},\"Account\":{\"x-tags\":[\"Account\"],\"type\":\"object\",\"description\":\"Details of the company account\\n\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/AccountID\"},\"sso_id\":{\"$ref\":\"#/components/schemas/SsoID\"},\"api_key\":{\"description\":\"Company-level API key (best practice is to use user-level API key)\",\"type\":\"string\",\"readOnly\":true},\"name\":{\"type\":\"string\",\"description\":\"Company name\",\"readOnly\":true,\"example\":\"Acme, Inc.\"},\"time_zone\":{\"type\":\"string\",\"readOnly\":true,\"example\":\"America/New_York\"},\"type\":{\"type\":\"string\",\"readOnly\":true},\"data_retention_in_days\":{\"type\":\"integer\",\"description\":\"Number of days to retain lead events. Events outside the retention period are automatically deleted permanently.\\n\"},\"data_truncated_at\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"keen_project_id\":{\"type\":\"string\",\"readOnly\":true},\"keen_read_api_key\":{\"type\":\"string\",\"readOnly\":true},\"keen_write_api_key\":{\"type\":\"string\",\"readOnly\":true},\"pricing_components\":{\"type\":\"array\",\"items\":{\"type\":\"object\"},\"readOnly\":true},\"billing_type\":{\"type\":\"string\",\"enum\":[\"contracted\",\"self_service\"],\"readOnly\":true},\"financial_state\":{\"type\":\"string\",\"enum\":[\"paid\",\"unpaid\"],\"description\":\"Only populated when the billing_type is \\\"contracted\\\"\",\"readOnly\":true},\"financial_state_updated_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"readOnly\":true},\"lead_ping_enabled\":{\"type\":\"boolean\",\"readOnly\":true},\"product_id\":{\"type\":\"string\",\"readOnly\":true,\"example\":\"lcx\"},\"state\":{\"type\":\"string\",\"readOnly\":true},\"connected_buyers\":{\"description\":\"List of connected buyers\",\"readOnly\":true,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"name\":{\"type\":\"string\"},\"sso_id\":{\"$ref\":\"#/components/schemas/ID\"},\"source\":{\"type\":\"string\",\"enum\":[\"formal\",\"entity\"],\"description\":\"How the connection was established: 'formal' for account connections, 'entity' for custom source entity connections\"}}}},\"connected_sellers\":{\"type\":\"array\",\"description\":\"List of connected sellers\",\"readOnly\":true,\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"name\":{\"type\":\"string\"},\"sso_id\":{\"$ref\":\"#/components/schemas/ID\"},\"source\":{\"type\":\"string\",\"enum\":[\"formal\",\"entity\"],\"description\":\"How the connection was established: 'formal' for account connections, 'entity' for custom source entity connections\"}}}},\"pending_sellers\":{\"type\":\"array\",\"description\":\"List of invited pending seller entities\",\"readOnly\":true,\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"name\":{\"type\":\"string\"},\"expired\":{\"type\":\"boolean\",\"description\":\"Whether the invitation has expired\"},\"invitation_expires_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the invitation expires\"}}}},\"pending_buyers\":{\"type\":\"array\",\"description\":\"List of invited pending buyer entities\",\"readOnly\":true,\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"name\":{\"type\":\"string\"},\"expired\":{\"type\":\"boolean\",\"description\":\"Whether the invitation has expired\"},\"invitation_expires_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the invitation expires\"}}}},\"subscriptions\":{\"type\":\"object\",\"properties\":{\"addons\":{\"$ref\":\"#/components/schemas/FeatureSubscription\"},\"base\":{\"$ref\":\"#/components/schemas/FeatureSubscription\"},\"pro\":{\"$ref\":\"#/components/schemas/FeatureSubscription\"},\"partner\":{\"$ref\":\"#/components/schemas/FeatureSubscription\"}}},\"features\":{\"type\":\"object\",\"properties\":{\"seller_access\":{\"type\":\"boolean\"},\"buyer_access\":{\"type\":\"boolean\"},\"lead_transactions\":{\"type\":\"boolean\"},\"conversion_feedback\":{\"type\":\"boolean\"},\"firehose\":{\"type\":\"boolean\"},\"third_party_add_on_services\":{\"type\":\"boolean\"},\"real_time_bidding\":{\"type\":\"boolean\"},\"leadconduit_trustedform_decisions\":{\"type\":\"boolean\"}}}},\"required\":[\"id\"]},\"AccountID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier of the account\",\"example\":\"5fd4371e940df5a34a3888b2\"}]},\"AuthenticatedUser\":{\"x-tags\":[\"Account\"],\"title\":\"User\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/UserID\",\"description\":\"ID of this user\"},\"sso_id\":{\"$ref\":\"#/components/schemas/SsoID\",\"example\":\"6493820b542ea0521e2a4543\"},\"api_key\":{\"type\":\"string\",\"description\":\"The user's API key\",\"example\":\"2f1d5f29915b866c7a2fa5de29613104\"},\"superuser\":{\"type\":\"boolean\",\"description\":\"Is the user a super user?\",\"example\":false},\"user_admin\":{\"type\":\"boolean\",\"description\":\"Can the user manage other users and verified domains?\",\"example\":true},\"subscription_admin\":{\"type\":\"boolean\",\"description\":\"Can the user manage subscriptions to TrustedForm, LeadConduit, and SuppressionList?\",\"example\":true},\"role_string\":{\"type\":\"string\",\"description\":\"The user's role (unused)\",\"enum\":[\"user\"],\"example\":\"user\"},\"first_name\":{\"type\":\"string\",\"description\":\"The user's first name\",\"example\":\"Jane\"},\"last_name\":{\"type\":\"string\",\"description\":\"The user's last name\",\"example\":\"Doe\"},\"email\":{\"type\":\"string\",\"description\":\"The user's email address\",\"example\":\"janedoe@company.com\"},\"phone\":{\"type\":\"string\",\"description\":\"The user's phone number\",\"example\":\"512-555-1212\"},\"accounts\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Account\"}},\"products\":{\"type\":\"array\",\"description\":\"The list of products available to the account\",\"items\":{\"$ref\":\"#/components/schemas/Product\"},\"example\":[{\"id\":\"lcx\",\"name\":\"LeadConduit\",\"base_url\":\"https://app.leadconduit.com\",\"marketing_url\":\"https://activeprospect.com/products/leadconduit/\",\"subscribed\":true},{\"id\":\"suppressionlist\",\"name\":\"SuppressionList\",\"base_url\":\"https://app.suppressionlist.com\",\"marketing_url\":\"https://activeprospect.com/products/leadconduit/\",\"subscribed\":true},{\"id\":\"trustedform\",\"name\":\"TrustedForm\",\"base_url\":\"https://app.trustedform.com\",\"marketing_url\":\"https://activeprospect.com/products/trustedform/\",\"subscribed\":true}]},\"membership\":{\"type\":\"object\",\"properties\":{\"account_id\":{\"$ref\":\"#/components/schemas/ID\"},\"lc_access\":{\"type\":\"boolean\"},\"sl_access\":{\"type\":\"boolean\"},\"tf_access\":{\"type\":\"boolean\"},\"product\":{\"type\":\"string\"},\"product_access\":{\"type\":\"boolean\"},\"subscription_admin\":{\"type\":\"boolean\"},\"user_admin\":{\"type\":\"boolean\"},\"user_id\":{\"$ref\":\"#/components/schemas/ID\"}},\"required\":[\"lc_access\",\"sl_access\",\"tf_access\"]},\"permissions\":{\"type\":\"object\",\"properties\":{\"lcx\":{\"type\":\"string\"},\"suppressionlist\":{\"type\":\"string\"},\"trustedform\":{\"type\":\"string\"}}},\"product_code\":{\"type\":\"string\",\"description\":\"The code for the current product\",\"enum\":[\"lcx\",\"trustedform\",\"suppressionlist\",\"account\"],\"x-enumDescriptions\":{\"lcx\":\"LeadConduit\",\"trustedform\":\"TrustedForm\",\"suppressionlist\":\"SuppressionList\"},\"example\":\"lcx\"},\"company_name\":{\"type\":\"string\"},\"expires\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"subscriptions\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/UserSubscription\"}},\"zendesk_jwt\":{\"type\":\"string\"},\"ui_state\":{\"type\":\"object\",\"description\":\"Tracks UI-specific state for the user, such as onboarding progress\",\"properties\":{\"has_seen_free_account_modal\":{\"oneOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"additionalProperties\":true},\"created_at\":{\"$ref\":\"#/components/schemas/Timestamp\"}},\"required\":[\"id\",\"email\",\"first_name\",\"last_name\"]},\"binary-rule\":{\"title\":\"Binary Rule\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ShortID\",\"description\":\"ID for this rule\",\"example\":\"1aacd0\"},\"lhv\":{\"$ref\":\"#/components/schemas/Template\",\"description\":\"The required left-hand value to be evaluated ([templating](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/) is supported)\",\"example\":\"lead.state\"},\"op\":{\"type\":\"string\",\"enum\":[\"is equal to\",\"is not equal to\",\"is less than\",\"is less than or equal to\",\"is greater than\",\"is greater than or equal to\",\"is included in\",\"is not included in\",\"includes\",\"does not include\",\"is between\",\"is not between\",\"matches pattern\",\"does not match pattern\"],\"example\":\"is equal to\",\"x-enumDescriptions\":{\"is equal to\":\"Is the [string](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/String) (case-insensitive), [number](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number), or [range](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `lhv` equal to the `rhv`?\",\"is not equal to\":\"Inverse of the `is equal to` operator.\",\"is less than\":\"Is the [numeric](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number) or [range average](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `lhv` numerically less than the `rhv`?\",\"is less than or equal to\":\"Is the [numeric](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number) or [range average](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `lhv` numerically less than or equal to the `rhv`?\",\"is greater than\":\"Is the [numeric](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number) or [range average](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `lhv` numerically more than the `rhv`?\",\"is greater than or equal to\":\"Is the [numeric](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number) or [range average](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `lhv` numerically more than or equal to the `rhv`?\",\"is between\":\"Is the [numeric](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number) or [range average](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `lhv` between the `rhv` [range](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `min` and `max` (inclusive)?\",\"is not between\":\"Is the [numeric](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number) or [range average](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `lhv` outside the `rhv` [range](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) `min` and `max` (exclusive)?\",\"is included in\":\"Is the [string](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/String), [number](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number), or [boolean](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Boolean) `lhv` included in the Array of values provided in the `rhv`?\",\"is not included in\":\"Is the [string](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/String), [number](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number), or [boolean](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Boolean) `lhv` missing from the Array of values provided in the `rhv`?\",\"includes\":\"Does the Array of [strings](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/String), [numbers](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number), or [booleans](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Boolean) provided in the `lhv` contain the `rhv`?\",\"does not include\":\"Is the Array of [strings](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/String), [numbers](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number), or [booleans](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Boolean) provided in the `lhv` missing the `rhv`?\"},\"description\":\"Binary operators compare the `lhv` and the `rhv`.\\n\"},\"rhv\":{\"oneOf\":[{\"$ref\":\"#/components/schemas/Template\"},{\"type\":\"number\"},{\"type\":\"boolean\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Template\"}}],\"description\":\"The right-hand value to be evaluated ([templating](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/) is supported)\",\"example\":\"TX\"},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\"}},\"additionalProperties\":false,\"required\":[\"lhv\",\"op\",\"rhv\"]},\"Cap\":{\"x-tags\":[\"Caps and Limits\"],\"type\":\"object\",\"description\":\"A cap allows limiting the number of leads sent into or out of a flow. \\nIf a lead is successful, it will be counted against the maximum configured leads. \\nIf configured, the rule set will be evaluated to determine whether a lead will be counted against the cap.\\n\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/CapID\"},\"type\":{\"type\":\"string\",\"description\":\"The type of this cap (LeadConduit may eventually support different types of caps)\",\"enum\":[\"volume\"]},\"name\":{\"description\":\"The human-readable name of the cap\",\"type\":\"string\",\"example\":\"Monthly leads from TX\"},\"maximum\":{\"type\":\"number\",\"description\":\"The number of successful leads that will be accepted\",\"example\":1200},\"duration\":{\"type\":\"number\",\"description\":\"The number duration_units for which the cap persists\",\"minimum\":1,\"examples\":[1]},\"duration_units\":{\"type\":\"string\",\"description\":\"The unit of time for which the cap persists\",\"enum\":[\"month\",\"week\",\"day\",\"hour\",\"minute\"]},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\",\"description\":\"This rule set must pass in order for the lead to count against the cap\"},\"caps\":{\"description\":\"Nested caps evaluated if rules for the parent cap pass\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Cap\"}},\"time_zone\":{\"description\":\"The time zone in which cap resets\",\"type\":\"string\",\"example\":\"America/New_York\"},\"reason\":{\"$ref\":\"#/components/schemas/Template\",\"description\":\"When the cap is met this is the reason (default: 'Cap reached')\"},\"created_at\":{\"description\":\"Read-only time the cap was created\",\"type\":\"string\",\"format\":\"date-time\",\"example\":\"2020-11-23T11:41:52Z\"}}},\"cap-counter\":{\"x-tags\":[\"Caps and Limits\"],\"title\":\"Cap Counter\",\"type\":\"object\",\"description\":\"A cap counter keeps track of the number of leads counted against the cap. The counter has the same ID as the cap\\nconfiguration saved with the flow. Most of the properties of the cap configuration are available on the cap counter, as\\na convenience.\\n\",\"properties\":{\"id\":{\"description\":\"ID of this cap counter\",\"$ref\":\"#/components/schemas/ID\",\"example\":\"5fd438f91f0d12766e2bfee5\"},\"cap_ids\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/CapID\"}},\"caps\":{\"description\":\"Nested caps evaluated if rules for the parent cap pass\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Cap\"}},\"count\":{\"description\":\"The number of successful leads during the current interval\",\"type\":\"integer\"},\"duration\":{\"type\":\"number\",\"description\":\"The number duration_units for which the cap persists\",\"minimum\":1,\"example\":1},\"duration_units\":{\"type\":\"string\",\"description\":\"The unit of time for which the cap persists\",\"enum\":[\"month\",\"week\",\"day\",\"hour\",\"minute\"]},\"expires_at\":{\"description\":\"Read-only time the cap interval ends\",\"type\":\"string\",\"format\":\"date-time\",\"example\":\"2020-11-23T11:41:52Z\"},\"failed_count\":{\"description\":\"The number of leads that failed because the cap was reached during the current interval\",\"type\":\"integer\"},\"flow_id\":{\"description\":\"ID of the flow this cap belongs to\",\"$ref\":\"#/components/schemas/FlowID\",\"example\":\"5fd438f91f0d12766e2bfee5\"},\"maximum\":{\"type\":\"number\",\"description\":\"The number of successful leads that will be accepted\",\"example\":1200},\"name\":{\"description\":\"The human-readable name of the cap\",\"type\":\"string\",\"example\":\"Monthly leads from TX\"},\"source_id\":{\"description\":\"ID of the source this cap belongs to\",\"$ref\":\"#/components/schemas/EntityID\",\"example\":\"5fd438f91f0d12766e2bfee5\"},\"started_at\":{\"description\":\"Read-only time the cap interval started\",\"type\":\"string\",\"format\":\"date-time\",\"example\":\"2020-11-23T11:41:52Z\"},\"step_id\":{\"description\":\"ID of the step this cap belongs to\",\"$ref\":\"#/components/schemas/ShortID\",\"example\":\"5fd438f91f0d12766e2bfee5\"},\"time_zone\":{\"description\":\"The time zone in which cap resets\",\"type\":\"string\",\"example\":\"America/New_York\"},\"type\":{\"type\":\"string\",\"description\":\"The type of this cap (LeadConduit may eventually support different types of caps)\",\"enum\":[\"volume\"]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"example\":\"2020-11-23T11:41:52Z\"}},\"additionalProperties\":false,\"required\":[\"type\",\"maximum\",\"duration\",\"duration_units\"]},\"cap-counters\":{\"title\":\"Cap Counters\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/cap-counter\"}},\"CapID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier of the cap\",\"example\":\"5fd438f91f0d12766e2bfee5\"}]},\"Caps\":{\"description\":\"A cap controls the behavior by setting the maximum and the duration. The counter for a cap is kept as a standalone record which shares cap's ID.\\n\",\"oneOf\":[{\"type\":\"null\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Cap\"},\"minItems\":1}]},\"Change\":{\"type\":\"object\",\"properties\":{\"action\":{\"type\":\"string\",\"description\":\"Action performed\",\"enum\":[\"create\",\"update\",\"delete\",\"changed\",\"moved\",\"removed\",\"added\"]},\"target\":{\"type\":\"string\",\"description\":\"The target of the change, which could be any property within the model being changed\"},\"delta_path\":{\"type\":\"string\",\"description\":\"The path that represents where the change is located within the delta object\"},\"previous\":{\"type\":\"object\",\"description\":\"The state of the target object before the change was made\",\"properties\":{\"value\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"object\"}},{\"type\":\"boolean\"}]},\"index\":{\"type\":\"number\"}}},\"current\":{\"type\":\"object\",\"description\":\"The current state of the target object\",\"properties\":{\"value\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"object\"}},{\"type\":\"boolean\"}]},\"index\":{\"type\":\"number\"}}}}},\"Changelog\":{\"x-tags\":[\"Changelogs\"],\"type\":\"object\",\"summary\":\"A changelog records the creation, update, or deletion of a LeadConduit models, logging the exact\\ndifference between the previous revision and the current one, which user made it, and in which account.\\nThe changelog contains is the full object state before and after the change was applied, and the difference \\nbetween the two.\\n\",\"properties\":{\"id\":{\"description\":\"ID of this Change Log\",\"$ref\":\"#/components/schemas/ChangelogID\"},\"action\":{\"type\":\"string\",\"description\":\"Action performed\",\"enum\":[\"create\",\"update\",\"delete\",\"changed\",\"moved\",\"removed\",\"added\"]},\"changes\":{\"type\":\"array\",\"description\":\"An object representing the normalization of the delta object\",\"items\":{\"$ref\":\"#/components/schemas/Change\"}},\"current_revision\":{\"type\":\"object\",\"additionalProperties\":true},\"delta_from_last_revision\":{\"type\":\"object\",\"description\":\"An object representing the difference between the previous revision and the latest revision of the model\",\"additionalProperties\":true},\"type\":{\"type\":\"string\",\"description\":\"The type of resource that was changed.\",\"enum\":[\"flow\",\"entity\",\"field\",\"report\"]},\"user\":{\"description\":\"User information. This will only be present if the user was signed in when the changes were made\",\"$ref\":\"#/components/schemas/ChangelogUser\"},\"created_at\":{\"description\":\"Read-only time the Change Log was created\",\"type\":\"string\",\"format\":\"date-time\",\"example\":\"2020-11-23T11:41:52Z\"}},\"required\":[\"id\",\"type\",\"action\",\"current_revision\",\"delta_from_last_revision\",\"changes\",\"created_at\"]},\"ChangelogID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier for a changelog\",\"example\":\"5fd439a2c8e1f3d4b6a72e91\"}]},\"ChangelogUser\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/UserID\"},\"api_key\":{\"type\":\"string\",\"description\":\"The user's ActiveProspect API key\",\"example\":\"2f1d5f29915b866c7a2fa5de29613104\"},\"first_name\":{\"description\":\"The user's first name\",\"type\":\"string\"},\"last_name\":{\"description\":\"The user's last name\",\"type\":\"string\"},\"email\":{\"description\":\"The user's email address\",\"type\":\"string\"}}},\"Changelogs\":{\"oneOf\":[{\"type\":\"null\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Changelog\"}}]},\"ConnectionID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier of a connection\"}]},\"ConnectionSuccessResponse\":{\"type\":\"object\",\"title\":\"Connection Created\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ConnectionID\"},\"connected_account\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/AccountID\"},\"sso_id\":{\"$ref\":\"#/components/schemas/SsoID\"},\"name\":{\"type\":\"string\",\"example\":\"Acme Corp\"}}},\"external_id\":{\"$ref\":\"#/components/schemas/ID\"},\"invitation_id\":{\"$ref\":\"#/components/schemas/InvitationID\"},\"relationship_type\":{\"type\":\"string\",\"enum\":[\"seller\",\"buyer\"]},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"created_by\":{\"type\":\"string\",\"example\":\"example@mail.com\"},\"ui_state\":{\"type\":\"object\",\"description\":\"UI state information for this connection\",\"properties\":{\"has_setup_buyer_delivery\":{\"type\":\"boolean\"}},\"additionalProperties\":true}}},\"Credential\":{\"x-tags\":[\"Account\"],\"type\":\"object\",\"description\":\"Used by integrations with external services that require authentication\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/CredentialID\"},\"name\":{\"description\":\"Friendly name for this credential\",\"type\":\"string\"},\"type\":{\"description\":\"The type of credential: user, token, oauth1, or oauth2\",\"type\":\"string\",\"enum\":[\"user\",\"token\",\"oauth1\",\"oauth2\"]},\"package\":{\"description\":\"The name of the LeadConduit integration package to which this credential belongs\",\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true}},\"discriminator\":{\"propertyName\":\"type\",\"mapping\":{\"user\":\"#/components/schemas/UserCredential\",\"token\":\"#/components/schemas/TokenCredential\",\"oauth1\":\"#/components/schemas/Oauth1Credential\",\"oauth2\":\"#/components/schemas/Oauth2Credential\"}},\"oneOf\":[{\"$ref\":\"#/components/schemas/UserCredential\"},{\"$ref\":\"#/components/schemas/TokenCredential\"},{\"$ref\":\"#/components/schemas/Oauth1Credential\"},{\"$ref\":\"#/components/schemas/Oauth2Credential\"}]},\"CredentialID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier for a credential\"}]},\"Credentials\":{\"oneOf\":[{\"type\":\"null\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Credential\"},\"minItems\":1}]},\"DeployResponse\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"description\":\"Success message for deploying a flow\",\"example\":\"Your flow was deployed and the most recent changes are now live\"}}},\"Destination\":{\"x-tags\":[\"Destinations\",\"Flows\"],\"type\":\"object\",\"description\":\"An internal representation of a Prismatic instance.\\n\",\"properties\":{\"name\":{\"description\":\"A customizable name of the destination.\",\"type\":\"string\",\"example\":\"Salesforce\"},\"integration_name\":{\"type\":\"string\",\"description\":\"The name of the integration as published in the Marketplace.\"},\"integration_icon_url\":{\"type\":\"string\",\"description\":\"Pre-signed URL for the integration icon.\"},\"instance_id\":{\"description\":\"The Prismatic instance ID.\",\"type\":\"string\"},\"actions\":{\"description\":\"A list of actions available in the configured instance. These map to Prismatic \\\"flows\\\" within an instance.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"name\":{\"description\":\"The name of the flow, or \\\"action\\\", available in the configured instance. One instance can have multiple flows.\",\"type\":\"string\",\"example\":\"Add Lead\"},\"action_id\":{\"description\":\"The Prismatic flow ID.\",\"type\":\"string\",\"example\":\"Add Lead\"},\"webhook_url\":{\"description\":\"The Prismatic webhook URL. This URL will invoke the Prismatic flow defined by the configured instance.\",\"type\":\"string\"}}}},\"flow_usages\":{\"description\":\"Contains data on flows in which the destination is used.\\nThis field is optional and is **only** included when the `include=flow_usages` query parameter is included in the request.\\n\",\"type\":\"object\",\"properties\":{\"count\":{\"description\":\"The total number of flows in which the destination is used.\",\"type\":\"integer\"},\"flows\":{\"description\":\"A list of flows in which the destination is used.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\",\"description\":\"The flow ID\",\"example\":\"5fd4371e940df5a34a3888b2\"},\"name\":{\"description\":\"The name of the flow\",\"type\":\"string\"}}}}}}}},\"DistributionStep\":{\"title\":\"Distribution Step\",\"type\":\"object\",\"description\":\"A distribution step is a container for multiple recipient steps with a configurable distribution method.\\nDuring handler construction, distribution steps are unwound into individual recipient steps. For waterfall\\ndistribution, recipients are executed sequentially and each subsequent recipient only runs if all prior\\nrecipients did not succeed. For broadcast distribution, all recipients are executed.\\n\",\"properties\":{\"type\":{\"type\":\"string\",\"enum\":[\"distribution\"]},\"id\":{\"$ref\":\"#/components/schemas/ShortID\"},\"description\":{\"type\":\"string\",\"maxLength\":120},\"distribution_method\":{\"description\":\"The method used to distribute leads to the recipient steps within this distribution.\\n\\\"Waterfall\\\" sends to each recipient in order until one succeeds. \\\"Send to each recipient\\\"\\nsends to all recipients.\\n\",\"type\":\"string\",\"enum\":[\"Send to each recipient\",\"Waterfall\"]},\"lead_type\":{\"description\":\"Whether the lead is shared across multiple buyers or exclusive to a single buyer.\\n\",\"type\":\"string\",\"enum\":[\"Shared\",\"Exclusive\"]},\"steps\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/RecipientStep\"}},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\"},\"pricing\":{\"$ref\":\"#/components/schemas/Pricing\"},\"enabled\":{\"type\":\"boolean\",\"default\":true}},\"additionalProperties\":false,\"required\":[\"type\",\"distribution_method\",\"lead_type\",\"steps\"]},\"Entities\":{\"oneOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Entity\"}},{\"type\":\"null\"}],\"minItems\":1},\"Entity\":{\"x-tags\":[\"Entities\"],\"description\":\"Entities are the foundation of identity in LeadConduit. They represent the \\\"who\\\" in every lead transaction - who sends leads, who receives them, and what systems are involved. Think of entities as the business cards of the LeadConduit ecosystem - they establish identity, capabilities, and relationships.\\n\\nAt their core, entities answer two fundamental questions:\\n1. **What does the entity represent?** (Identity)\\n2. **How can it integrate with LeadConduit?** (Capability)\\n3. **How am I interacting with the entity through Leadconduit?** (Relationships)\\n\\n## Why Entities Exist\\n\\n### The Identity Problem\\nLeadConduit needs to track:\\n\\n- Companies selling leads\\n- Companies buying leads  \\n- Web forms collecting leads\\n- CRM systems receiving leads\\n- Analytics platforms tracking leads\\n- Enhancement services enriching leads\\n\\nWithout a unified identity system, this becomes chaos. Entities solve this by providing a consistent way to represent any participant in the lead ecosystem.\\n\\n### The Capability Problem\\nDifferent systems have different capabilities:\\n- A web form can send leads but not receive them\\n- A CRM can receive leads but typically doesn't send them \\n- A partner company might both send and receive leads\\n- Each system supports different integration methods\\n\\nEntities encode these capabilities through their type classifications and module associations.\\n\\n### The Relationship Problem\\nBusiness relationships are complex:\\n- You might buy leads from Company A\\n- You might sell leads to Company B\\n- Company C might be both a buyer and seller\\n\\nEntities model these relationships, especially through the account entity and connection system.\\n\\n## Core Concepts\\n\\n### Entity Classification\\n\\nEvery entity has two fundamental classifications that define its role:\\n\\n**Source Classification** (Can this entity send leads?)\\n- `seller` - A company that sells leads\\n- `form` - A web form or landing page\\n- `other` - Any other type of lead source\\n- `null` - Cannot send leads\\n\\n**Recipient Classification** (Can this entity receive leads?)\\n- `buyer` - A company that purchases leads\\n- `crm` - Customer Relationship Management system\\n- `analytics` - Analytics or tracking platform (including internal scoring services)\\n- `enhancement` - Data enrichment service\\n- `esp` - Email Service Provider\\n- `other` - Any other type of recipient\\n- `null` - Cannot receive leads\\n\\nAn entity can be both a source and recipient. For example, a partner company might be classified as both `source: \\\"seller\\\"` and `recipient: \\\"buyer\\\"`.\\n\\n**Important Note**: Entities can represent both business relationships AND technical systems. For example, a company might create an entity called \\\"Scoring Service\\\" with `recipient: 'analytics'` to represent their internal scoring API. This allows them to track all requests to that service across multiple flows.\\n\\n### Entity Types by Management\\n\\n**Account Entities**\\n- Special entities representing LeadConduit account holders\\n- Enable account-to-account lead sharing\\n- Automatically created when an account is created\\n- Can form connections with other accounts\\n- Always have both source and recipient capabilities\\n\\n**Standard Entities**\\n- Pre-built by LeadConduit\\n- Represent well-known companies (that do not have an account) and well-known services/platforms\\n- Available to all accounts\\n- Cannot be modified by users\\n- Examples: Major CRMs (Salesforce, HubSpot), big lead sellers, popular form-builder services\\n\\n**Custom Entities**\\n- Created by individual accounts when there is no account entity or standard entity\\n- Represent unique business relationships\\n- Only editable by the creating account\\n- Example: Proprietary scoring system, third party data services with no built-in integration\\n\\n**Pending Entities**\\n- Temporary entities created during the connection invitation process\\n- Convert to regular entities once invitation is accepted\\n- Used to pre-configure flows before partners join\\n\\n### The Module System\\n\\nModules are capability declarations that define HOW an entity can technically communicate. A `module_id` is a unique identifier for a specific integration (e.g., \\\"Create Salesforce Lead\\\", \\\"Send to HubSpot Contact\\\", \\\"LendingTree Ping Post\\\"). Each entity has a `module_ids` array that acts as both a capability list and a constraint system.\\n\\n**How Module Constraints Work**:\\n- When `module_ids` is non-empty, the entity can ONLY be configured with those specific integrations\\n- When adding the entity to a flow, users can only select from the supported modules\\n- This prevents configuration errors and ensures compatibility\\n\\n**Real-World Example - LendingTree Entity**:\\nLendingTree has proprietary lead submission requirements that only work with specific integrations. Their entity's `module_ids` array contains only the modules that support their format:\\n```json\\n{\\n  \\\"name\\\": \\\"LendingTree\\\",\\n  \\\"module_ids\\\": [\\n    \\\"leadconduit-lendingtree.inbound.post\\\",\\n    \\\"leadconduit-lendingtree.inbound.ping_post\\\"\\n  ]\\n}\\n```\\n\\nFor example, adding LendingTree as a flow source, only allows configuration of LendingTree-specific integration module IDs. This eliminates the possibility of trying to use a generic HTTP module that wouldn't understand LendingTree's proprietary format.\\n\\n**Module Types**:\\n- **Standard Integration**: Basic HTTP communication (`leadconduit-default.inbound/outbound`)\\n- **Third-Party Integrations**: Vendor-specific integrations (`leadconduit-salesforce.outbound`)  \\n- **Generic Integration**: Format-specific implementations (`leadconduit-custom.outbound.json`)\\n- **Internal Platform Integrations**: LeadConduit-to-LeadConduit (`leadconduit-integration-leadconduit.outbound.to_buyer`)\\n\\n**Empty vs Non-Empty Arrays**:\\n- Empty `module_ids`: Entity can use any available integration module\\n- Non-empty `module_ids`: Entity is restricted to only those specific modules\\n\\n### The Reverse Integration Pattern\\n\\nOne of LeadConduit's most powerful features is how it handles vendor-specific integrations through entities. This flips the traditional integration model on its head.\\n\\n**Traditional Lead Industry Model:**\\n- Buyer publishes submission specifications\\n- Every seller must implement the buyer's API\\n- Sellers do custom development for each buyer\\n- Technical burden is on the seller\\n\\n**LeadConduit's Entity-Based Model:**\\n- Major vendors have custom integration modules\\n- These modules are associated with the vendor's entity\\n- Buyers simply select the vendor's entity as a source\\n- LeadConduit handles all the technical complexity\\n\\n**Real-World Example:**\\nA major lead vendor requires:\\n- Proprietary authentication scheme\\n- Custom data format with specific field names\\n- Special validation rules\\n- Unique error handling\\n\\nInstead of every buyer implementing this vendor's requirements:\\n1. The vendor gets a LeadConduit account (creating an account entity)\\n2. Their custom integration module is associated with their account entity\\n3. Any buyer can now receive leads from them by adding that entity as a source\\n4. The buyer selects the vendor's entity, and LeadConduit automatically uses the correct integration\\n\\nThis approach is particularly valuable because:\\n- Large vendors often have the market power to dictate technical requirements\\n- They want to make it easy for buyers to work with them\\n- Buyers don't need technical resources to integrate with complex vendors\\n- Integration happens once, benefits everyone\\n\\n**The Shift to Account Entities:**\\nLeadConduit is moving away from standard entities in favor of requiring all participants to have accounts. This means:\\n- Every major vendor will have their own account entity\\n- Custom integrations are attached to these account entities\\n- Better accountability and relationship tracking\\n- More flexibility for vendors to manage their own integration requirements\\n\\n### Connection System\\n\\nFor account entities (representing other LeadConduit accounts), the connection system tracks business relationships:\\n\\n**Connection Types**\\n- `seller`: They sell leads to you\\n- `buyer`: They buy leads from you\\n- `both`: Bidirectional relationship\\n- `null`: No active connection\\n\\nConnections enable:\\n- Simplified account-to-account lead sharing\\n- Relationship visibility in the UI\\n- Access control for lead flow\\n- Business relationship tracking\\n\\n## Entity Lifecycle\\n\\n### Creation\\nWhen an entity is created, it establishes:\\n1. **Identity**: Name, description, logo, website\\n2. **Classification**: What type of source/recipient\\n3. **Capabilities**: Which modules it supports\\n4. **Ownership**: Which account owns it (for custom entities)\\n\\n### Usage\\nEntities are used in flows by:\\n1. **Adding as a source**: Defines where leads come from\\n2. **Adding as a recipient**: Defines where leads go\\n3. **Configuring integration**: Using the entity's supported modules\\n4. **Applying business rules**: Based on the entity relationship\\n\\n### Updates\\nWhen entities are updated:\\n1. Changes propagate to all flows using the entity\\n2. Historical data maintains the entity reference\\n3. Active flows automatically use new entity metadata\\n4. No disruption to lead processing\\n\\n### Deprecation\\nInstead of deletion, entities can be deprecated:\\n1. Marked with a deprecation flag\\n2. Can reference a replacement entity\\n3. Existing usage continues to work\\n4. New usage is discouraged or prevented\\n\\n## Special Entity Behaviors\\n\\n### Enhancement Recipients\\nEnhancement services (data append, verification, etc.) are special:\\n- They receive lead data for processing\\n- They don't consume leads like buyers do\\n- They're excluded from certain account relationship tracking\\n- They typically return enriched data back to the flow\\n\\n### Account Entity Auto-Creation\\nWhen a LeadConduit account is created:\\n1. An entity is automatically created with the same ID\\n2. It's marked as both source and recipient\\n3. It gets standard B2B communication modules\\n4. It represents that account in the entity ecosystem\\n\\n### Module Inheritance\\nEntities inherit certain behaviors from their modules:\\n- Authentication requirements\\n- Configuration options\\n- Data format expectations\\n- Integration-specific features\\n\\n## Business Implications\\n\\n### For Lead Buyers\\nEntities representing buyers:\\n- Track which companies purchase your leads\\n- Enable consistent delivery configuration\\n- Maintain delivery history\\n- Support buyer-specific customization\\n\\nMore importantly for buyers receiving leads:\\n- **No custom development needed** for complex vendors\\n- **Automatic integration** with major lead sources\\n- **Reduced technical burden** - just select the vendor's entity\\n- **Faster onboarding** with new lead sources\\n- **Consistent experience** across all vendors\\n\\n### For Lead Sellers  \\nEntities representing sellers:\\n- Identify lead sources clearly\\n- Enable source-specific validation\\n- Track source quality metrics\\n- Support seller-specific pricing\\n\\nFor major vendors with custom requirements:\\n- **Control their integration** specifications\\n- **Implement once** for all buyers on LeadConduit\\n- **Reduce buyer friction** by eliminating technical barriers\\n- **Maintain standards** while being easy to work with\\n- **Scale distribution** without buyer-by-buyer integrations\\n\\n### For Integrations\\nEntities representing systems:\\n- Standardize integration configuration\\n- Enable reuse across flows\\n- Maintain consistent behavior\\n- Simplify credential management\\n\\n**Key distinction**: While entities enable configuration reuse across flows, each flow must still be independently configured to connect to the service. The entity provides:\\n- **Identity tracking** - Know which flows use the service\\n- **Usage analytics** - Track requests across all flows\\n- **Consistent naming** - Same entity name in all flows\\n- **Classification** - Properly categorize the service type\\n\\nFor example, a \\\"Scoring Service\\\" entity:\\n- Represents your internal lead scoring API\\n- Used in multiple flows for consistency\\n- Each flow independently configures the API endpoint and credentials\\n- Allows tracking all scoring requests across your account\\n\\nThe reverse integration pattern means:\\n- **Vendors define requirements** instead of conforming to each buyer\\n- **LeadConduit implements** the vendor's specifications\\n- **Buyers benefit** without doing any integration work\\n- **Market power** translates to technical convenience\\n\\n### For Partner Relationships\\nAccount entities enable:\\n- Direct account-to-account lead sharing\\n- Trusted business relationships\\n- Simplified technical integration\\n- Relationship visibility\\n- Custom integration attachment\\n\\n## Common Patterns\\n\\n### Multi-Role Entities\\nMany entities serve multiple roles:\\n```\\nPartner Company ABC\\n├── As a seller: Sends leads to you\\n├── As a buyer: Receives leads from you\\n└── As an account: Has their own LeadConduit instance\\n```\\n\\n### Technical Service Entities\\nEntities often represent internal technical services:\\n```\\nInternal Services\\n├── Scoring Service (analytics recipient)\\n├── Data Validation API (enhancement recipient)\\n├── Lead Router (other recipient)\\n└── Internal CRM (crm recipient)\\n```\\n\\nEach service entity:\\n- Has consistent naming across flows\\n- Enables tracking of all requests\\n- Requires independent configuration per flow\\n- Groups related technical integrations\\n\\n### Integration Patterns\\nEntities often follow integration patterns:\\n```\\nCRM Integration Pattern:\\n├── Standard CRM Entity (e.g., Salesforce)\\n├── Multiple flows use the same entity\\n├── Each flow configures differently\\n└── All share core CRM capabilities\\n```\\n\\n## Best Practices\\n\\n### Naming Conventions\\n- Use clear, recognizable names\\n- Include company/system name\\n- Avoid generic names like \\\"CRM\\\" or \\\"Buyer\\\"\\n- Consider future growth (avoid \\\"Test\\\" or \\\"Temp\\\")\\n\\n### Classification Selection\\n- Choose the most specific type available\\n- Use \\\"other\\\" only when no specific type fits\\n- Consider primary business relationship\\n- Don't force-fit wrong classifications\\n\\n### Module Selection\\n- Only include actually supported modules\\n- Don't add modules \\\"just in case\\\"\\n- Consider authentication requirements\\n- Match modules to business needs\\n\\n### Relationship Management\\n- Use standard entities when available\\n- Create custom entities for unique relationships\\n- Leverage account entities for B2B partnerships\\n- Document special configurations in description\\n\\n## Common Misconceptions\\n\\n### \\\"Entities are just labels\\\"\\nReality: Entities carry configuration, capabilities, and relationship data. They're active participants in lead flow, not passive labels.\\n\\n### \\\"I need a new entity for each flow\\\"\\nReality: Entities should be reused across flows. Create once, use many times.\\n\\n### \\\"Standard entities can't be customized\\\"\\nReality: While you can't change standard entities, you can configure their integrations, acceptance criteria, volume caps, pricing, etc differently in each flow.\\n\\n### \\\"Account entities are complicated\\\"\\nReality: Account entities simply represent another account on the platform. Each account only has one account entity, platform wide.\\n\\n## Key Takeaways\\n\\n1. **Entities are Identity**: They establish who participates in lead transactions\\n2. **Classification Drives Behavior**: Source and recipient types determine capabilities\\n3. **Modules Define Integration**: The technical \\\"how\\\" of lead movement\\n4. **Reverse Integration is Powerful**: Vendors define specs, LeadConduit implements, buyers benefit automatically\\n5. **Account Entities are the Future**: Moving away from standard entities to account-based participation\\n6. **Relationships Matter**: Especially for account-to-account lead sharing\\n7. **Reuse is Key**: Create entities once, use across multiple flows\\n8. **Custom Integrations Attach to Entities**: Major vendors get their own integration modules\\n9. **Dual Purpose**: Entities can represent both business relationships AND technical services\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/EntityID\"},\"name\":{\"type\":\"string\",\"description\":\"The name of the entity which is displayed throughout LeadConduit's UI\",\"example\":\"A Corporation\"},\"description\":{\"type\":\"string\"},\"standard\":{\"type\":\"boolean\",\"description\":\"Read-only flag indicating whether this is a built-in entity\",\"readOnly\":true,\"example\":false},\"account\":{\"oneOf\":[{\"type\":\"boolean\"},{\"type\":\"null\"}],\"description\":\"Read-only flag indicating whether this entity represents another LeadConduit account holder\",\"readOnly\":true,\"example\":true},\"pending\":{\"type\":\"boolean\",\"description\":\"Read-only flag indicating whether this entity represents a pending entity waiting for invitation acceptance\",\"readOnly\":true,\"example\":true},\"connected\":{\"type\":\"string\",\"enum\":[\"seller\",\"buyer\",\"both\"],\"description\":\"Read-only flag if this Account entity is connected to my account\",\"readOnly\":true,\"example\":\"seller\"},\"connected_account_id\":{\"description\":\"Associated Account ID for a custom entity.\",\"$ref\":\"#/components/schemas/ID\"},\"deprecated\":{\"type\":\"boolean\",\"example\":false},\"see\":{\"$ref\":\"#/components/schemas/EntityID\",\"description\":\"The alternative entity ID to be used instead of this deprecated entity\"},\"field_suffix\":{\"description\":\"The suffix required for all custom fields\",\"oneOf\":[{\"type\":\"string\",\"minLength\":3,\"maxLength\":5,\"pattern\":\"^[0-9a-zA-Z]+$\",\"example\":\"acorp\"},{\"type\":\"null\"}]},\"invitation_id\":{\"oneOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"null\"}],\"description\":\"The ID of the invitation ID created on Accounts side to reference the entity\"},\"invitation_expires_at\":{\"oneOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"The expiration date of the invitation from Accounts service\",\"readOnly\":true,\"example\":\"2025-11-07T00:00:00Z\"},\"expired\":{\"type\":\"boolean\",\"description\":\"Flag indicating whether the invitation has expired\",\"readOnly\":true,\"example\":false},\"flow_ids\":{\"description\":\"Array of flow IDs where this entity is listed in the `sources` array (or `null` if the `account` property is `false`\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/FlowID\"},\"example\":[\"5fd4371e940df5a34a3888b2\"]},\"logo_url\":{\"description\":\"The logo for this entity\",\"oneOf\":[{\"type\":\"string\"},{\"type\":\"null\"}],\"format\":\"uri\"},\"module_ids\":{\"description\":\"Array of integration module IDs that are supported by this entity\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ModuleID\"}},\"source\":{\"description\":\"Is this entity a lead source and if so, what kind?\",\"oneOf\":[{\"type\":\"null\"},{\"type\":\"string\",\"enum\":[\"form\",\"seller\",\"other\"]}]},\"recipient\":{\"description\":\"Is this entity a lead recipient and if so, what kind?\",\"oneOf\":[{\"type\":\"null\"},{\"type\":\"string\",\"enum\":[\"buyer\",\"crm\",\"analytics\",\"enhancement\",\"esp\",\"other\"]}]},\"time_zone\":{\"description\":\"If this entity represents a buyer or seller with an account, this is the account's time zone\",\"type\":\"string\",\"example\":\"America/Los Angeles\"},\"trustedform_certified_vendor\":{\"description\":\"If this entity represents a seller, is that company a TrustedForm Certified Vendor?\",\"type\":\"boolean\",\"example\":true},\"website\":{\"description\":\"If this entity represents a buyer or seller, this is the URL to their marketing site\",\"type\":\"string\",\"format\":\"uri\"},\"created_at\":{\"description\":\"The time this entity was created\",\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"updated_at\":{\"description\":\"The time this entity was last modified\",\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true}},\"additionalProperties\":false,\"required\":[\"name\",\"source\",\"recipient\",\"module_ids\"]},\"EntityAlias\":{\"x-tags\":[\"Entities\"],\"title\":\"Entity Alias\",\"description\":\"An entity alias provides a custom display name for a source or recipient entity within an account.\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"entity_id\":{\"description\":\"The ID of the entity this alias belongs to\",\"type\":\"string\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7a8\"},\"entity_alias\":{\"description\":\"The custom alias name for the entity\",\"type\":\"string\",\"example\":\"My Custom Source Name\"},\"account_id\":{\"$ref\":\"#/components/schemas/ID\",\"description\":\"The account ID that owns this alias\"},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true}},\"required\":[\"entity_id\",\"entity_alias\"]},\"EntityID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier for an entity\",\"example\":\"5fd4371e940df5a34a3888b2\"}]},\"EntitySummary\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/EntityID\"},\"name\":{\"type\":\"string\",\"readOnly\":true},\"time_zone\":{\"type\":\"string\",\"example\":\"America/New_York\"}},\"additionalProperties\":false,\"required\":[\"id\",\"name\"]},\"Event\":{\"x-tags\":[\"Leads\"],\"type\":\"object\",\"title\":\"Event\",\"description\":\"An event tracks what happened with a lead at a particular step in a flow. An event is a self-contained snapshot of the state of the lead at the time the lead visited the step. It contains a full copy of all lead data, along with all data that was appended before that step. Every event contains the below properties.\",\"properties\":{\"type\":{\"type\":\"string\",\"enum\":[\"source\",\"recipient\",\"filter\",\"feedback-received\",\"feedback-sent\",\"retry\"]}},\"discriminator\":{\"propertyName\":\"type\",\"mapping\":{\"source\":\"#/components/schemas/source-event\",\"recipient\":\"#/components/schemas/recipient-event\",\"filter\":\"#/components/schemas/filter-event\",\"feedback-received\":\"#/components/schemas/feedback-received-event\",\"feedback-sent\":\"#/components/schemas/feedback-sent-event\",\"retry\":\"#/components/schemas/retry-event\"}},\"oneOf\":[{\"$ref\":\"#/components/schemas/source-event\"},{\"$ref\":\"#/components/schemas/recipient-event\"},{\"$ref\":\"#/components/schemas/filter-event\"},{\"$ref\":\"#/components/schemas/feedback-received-event\"},{\"$ref\":\"#/components/schemas/feedback-sent-event\"},{\"$ref\":\"#/components/schemas/retry-event\"}]},\"EventID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier for an a lead event\",\"example\":\"5fd4371e940df5a34a3888b2\"}]},\"event-metrics-interval\":{\"title\":\"Event Metrics Interval\",\"example\":\"daily\",\"anyOf\":[{\"type\":\"string\"},{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"units\":{\"type\":\"string\"}}}]},\"event-metrics-timeframe\":{\"title\":\"Event Metrics Timeframe\",\"example\":\"this_14_days\",\"anyOf\":[{\"$ref\":\"#/components/schemas/event-metrics-timeframe-bounded\"},{\"type\":\"string\",\"example\":\"this_14_days\"}]},\"event-metrics-timeframe-bounded\":{\"title\":\"Event Metrics Timeframe Bounded\",\"type\":\"object\",\"properties\":{\"start\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"end\":{\"$ref\":\"#/components/schemas/Timestamp\"}}},\"EventProperties\":{\"type\":\"object\",\"description\":\"An event tracks what happened with a lead at a particular step in a flow. An event is a self-contained snapshot of the state of the lead at the time the lead visited the step. It contains a full copy of all lead data, along with all data that was appended before that step. Every event contains the below properties.\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/EventID\"},\"outcome\":{\"type\":\"string\",\"description\":\"The outcome of the event\"},\"reason\":{\"type\":\"string\",\"description\":\"The reason for a failure or error outcome\"},\"vars\":{\"type\":\"object\"},\"host\":{\"type\":\"string\"},\"start_timestamp\":{\"description\":\"The number of milliseconds elapsed since epoch at the start of the step processing\",\"type\":\"integer\"},\"end_timestamp\":{\"description\":\"The number of milliseconds elapsed since epoch at the end of the step processing\",\"type\":\"integer\"},\"firehose\":{\"$ref\":\"#/components/schemas/Firehose\"},\"ms\":{\"description\":\"The number of milliseconds that elapsed while processing the lead\",\"type\":\"integer\"},\"wait_ms\":{\"type\":\"integer\",\"description\":\"The number of milliseconds that LeadConduit spent waiting for all recipients to respond\"},\"overhead_ms\":{\"description\":\"The number of milliseconds of overhead that LeadConduit added while processing the step\",\"type\":\"integer\"},\"lag_ms\":{\"type\":\"integer\"},\"total_ms\":{\"type\":\"integer\",\"description\":\"The number of milliseconds that elapsed since the lead was submitted\"},\"handler_version\":{\"$ref\":\"#/components/schemas/SemanticVersion\",\"description\":\"The version of the lead handler\"},\"version\":{\"$ref\":\"#/components/schemas/SemanticVersion\",\"description\":\"The schema version of the event\"},\"cap_reached\":{\"type\":\"boolean\"},\"flow_ping_limits\":{\"$ref\":\"#/components/schemas/PingLimit\"},\"source_ping_limits\":{\"$ref\":\"#/components/schemas/PingLimit\"},\"ping_limit_reached\":{\"type\":\"boolean\"},\"expires_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"The time this event will be automatically deleted from LeadConduit (events are retained for 90 days)\"}},\"required\":[\"id\",\"type\",\"outcome\",\"reason\"]},\"EventQuery\":{\"description\":\"Query parameters for retrieving events\",\"type\":\"object\",\"properties\":{\"after_id\":{\"$ref\":\"#/components/schemas/EventID\",\"description\":\"Return only events that were created after the one with this ID (exclusive)\"},\"before_id\":{\"$ref\":\"#/components/schemas/EventID\",\"description\":\"Return only events that were created before the one with this ID (exclusive)\"},\"start\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Return only events that were created at or after this time\"},\"end\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Return only events that were created at or before this time\"},\"rules\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Rule\"},\"description\":\"Rules to select matching events\"},\"include\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"An array of fields to include. Cannot be used with exclude.\"},\"exclude\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"An array of fields to exclude. Cannot be used with include.\"},\"limit\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":1000,\"description\":\"The maximum number of events to return (maximum limit is 1000, default 100)\"},\"sort\":{\"type\":\"string\",\"description\":\"The results are sorted by date. Use asc to sort by oldest first or desc to sort by newest first. Defaults to desc.\"}}},\"event-statistic\":{\"title\":\"Event Statistic\",\"type\":\"object\",\"properties\":{\"source-submitted\":{\"description\":\"Total number of leads submitted to LeadConduit by a source\",\"type\":\"integer\"},\"source-success\":{\"description\":\"Total number of leads submitted to LeadConduit by a source resulting in success (lead was purchased)\",\"type\":\"integer\"},\"source-failure\":{\"description\":\"Total number of leads submitted to LeadConduit by a source resulting in failure (lead was not purchased)\",\"type\":\"integer\"},\"source-error\":{\"description\":\"Total number of leads submitted to LeadConduit by a source resulting in error\",\"type\":\"integer\"},\"recipient-submitted\":{\"description\":\"Total number of leads submitted by LeadConduit to a recipient\",\"type\":\"integer\"},\"recipient-success\":{\"description\":\"Total number of leads submitted by LeadConduit to a recipient resulting in success (lead was purchased)\",\"type\":\"integer\"},\"recipient-failure\":{\"description\":\"Total number of leads submitted by LeadConduit to a recipient resulting in failure (lead was not purchased)\",\"type\":\"integer\"},\"recipient-error\":{\"description\":\"Total number of leads submitted by LeadConduit to a recipient resulting in error\",\"type\":\"integer\"},\"return-received-submitted\":{\"description\":\"Total number of returns to LeadConduit by a recipient\",\"type\":\"integer\"},\"return-received-success\":{\"description\":\"Total number of returns to LeadConduit by a recipient resulting in success (lead was returned)\",\"type\":\"integer\"},\"return-received-failure\":{\"description\":\"Total number of returns to LeadConduit by a recipient resulting in failure (return was denied)\",\"type\":\"integer\"},\"return-received-error\":{\"description\":\"Total number of returns to LeadConduit by a recipient resulting in error\",\"type\":\"integer\"},\"return-sent-submitted\":{\"description\":\"Total number of returns sent by LeadConduit to a source\",\"type\":\"integer\"},\"return-sent-success\":{\"description\":\"Total number of returns sent by LeadConduit to a source resulting in success (lead was returned to the source)\",\"type\":\"integer\"},\"return-sent-failure\":{\"description\":\"Total number of returns sent by LeadConduit to a source resulting in failure (return was denied by the source)\",\"type\":\"integer\"},\"return-sent-error\":{\"description\":\"Total number of returns sent by LeadConduit to a source resulting in error\",\"type\":\"integer\"},\"conversion-received-submitted\":{\"description\":\"Total number of conversions to LeadConduit by a recipient\",\"type\":\"integer\"},\"conversion-received-success\":{\"description\":\"Total number of conversions to LeadConduit by a recipient resulting in success (lead was marked converted)\",\"type\":\"integer\"},\"conversion-received-failure\":{\"description\":\"Total number of conversions to LeadConduit by a recipient resulting in failure (conversion was denied)\",\"type\":\"integer\"},\"conversion-received-error\":{\"description\":\"Total number of conversions to LeadConduit by a recipient resulting in error\",\"type\":\"integer\"},\"conversion-sent-submitted\":{\"description\":\"Total number of conversions sent by LeadConduit to a source\",\"type\":\"integer\"},\"conversion-sent-success\":{\"description\":\"Total number of conversions sent by LeadConduit to a source resulting in success (lead was reported converted to the source)\",\"type\":\"integer\"},\"conversion-sent-failure\":{\"description\":\"Total number of conversions sent by LeadConduit to a source resulting in failure (conversion was denied by the source)\",\"type\":\"integer\"},\"conversion-sent-error\":{\"description\":\"Total number of conversions sent by LeadConduit to a source resulting in error\",\"type\":\"integer\"},\"ping-submitted\":{\"description\":\"Total count of pings submitted to LeadConduit by a source\",\"type\":\"integer\"},\"ping-success\":{\"description\":\"Total number of pings submitted to LeadConduit by a source that result in success\",\"type\":\"integer\"},\"ping-success-rate\":{\"description\":\"The percentage of submitted pings that resulted in success\",\"type\":\"integer\"},\"ping-win-rate\":{\"description\":\"The percentage of pings submitted by a source that resulted in a source submission\",\"type\":\"integer\"},\"cost\":{\"description\":\"The total cost in USD for the leads purchased as determined by the source pricing configuration\",\"type\":\"integer\"},\"revenue\":{\"description\":\"The total revenue in USD for leads sold as determined by recipient pricing configuration\",\"type\":\"integer\"},\"profit\":{\"description\":\"The difference between `revenue` and `cost`\",\"type\":\"integer\"},\"cost-per-conversion-received-success\":{\"description\":\"The cost in USD for each successful conversion that occurred for the leads submitted during the specified timeframe.\",\"type\":\"integer\"},\"avg-cost-per-lead\":{\"description\":\"The average cost in USD paid per lead calculated by dividing cost by the number of good leads (`source-submitted-success` minus `return-sent-success`)\",\"type\":\"integer\"},\"avg-revenue-per-lead\":{\"description\":\"The average revenue in USD received per lead calculated by dividing `revenue` by the number of good leads (`recipient-submitted-success` minus `return-received-success`)\",\"type\":\"integer\"}}},\"event-statistics\":{\"title\":\"Event Statistics\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/event-statistic\"}},\"Export\":{\"x-tags\":[\"Exports\"],\"type\":\"object\",\"description\":\"An export job that produces a CSV of lead events for a given time range\\nand field selection.\\n\",\"properties\":{\"id\":{\"description\":\"ID of this export\",\"$ref\":\"#/components/schemas/ID\"},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the export was requested.\"},\"status\":{\"type\":\"string\",\"description\":\"Current state of the export job.\",\"enum\":[\"created\",\"processing\",\"complete\",\"error\",\"truncated\"]},\"start\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Start of the time range covered by this export (inclusive).\"},\"end\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"End of the time range covered by this export (exclusive).\"},\"filter_rules\":{\"type\":\"array\",\"description\":\"Rules used to filter the events included in the export.\",\"items\":{\"type\":\"object\",\"properties\":{\"lhv\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"rhv\":{\"type\":\"string\"}}}},\"email_to\":{\"type\":\"array\",\"description\":\"Email addresses notified when the export completes.\",\"items\":{\"type\":\"string\"}},\"fields\":{\"type\":\"array\",\"description\":\"Lead/event fields included in the resulting CSV.\",\"items\":{\"type\":\"string\"}},\"date_format\":{\"type\":\"string\",\"description\":\"Date format used in the resulting CSV.\",\"enum\":[\"standard\",\"legacy\"]},\"user\":{\"type\":\"object\",\"description\":\"User who requested the export.\",\"properties\":{\"id\":{\"type\":\"string\"},\"first_name\":{\"type\":\"string\"},\"last_name\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"sso_id\":{\"type\":\"string\"}}},\"expires_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the export becomes unavailable for download.\"},\"reason\":{\"type\":\"object\",\"description\":\"Optional explanation when the status is `truncated` or `error`.\",\"properties\":{\"message\":{\"type\":\"string\"}}},\"error\":{\"type\":\"string\",\"description\":\"Error message when the status is `error`.\"},\"exported_docs\":{\"type\":\"integer\",\"description\":\"Number of lead/event records included in the resulting CSV.\"},\"file_name\":{\"type\":\"string\",\"description\":\"Name of the resulting CSV file.\"},\"downloads\":{\"type\":\"array\",\"description\":\"Audit log of users who have downloaded this export.\",\"items\":{\"type\":\"object\"}}},\"required\":[\"id\",\"created_at\",\"status\"]},\"FeatureSubscription\":{\"type\":\"object\",\"title\":\"Feature Subscription\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/FeatureSubscriptionID\"},\"state\":{\"type\":\"string\",\"enum\":[\"active\",\"inactive\"]},\"created_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Time at which the feature subscription was created\"},\"updated_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Time at which the feature subscription was most recently updated\"},\"active_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Time at which the feature subscription became active\"},\"inactive_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Time at which the feature subscription became inactive\"},\"product_offering_id\":{\"$ref\":\"#/components/schemas/ID\"},\"product_offering_component\":{\"type\":\"string\",\"enum\":[\"partner\",\"base\",\"addons\",\"pro\"]}},\"additionalProperties\":true,\"required\":[\"id\",\"product_offering_component\",\"product_offering_id\",\"state\"]},\"FeatureSubscriptionID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier for an a feature subscription\",\"example\":\"5fd4371e940df5a34a3888b2\"}]},\"Feedback\":{\"description\":\"Feedback specifies the configuration for receiving and sending feedback\\nabout a lead. When receiving feedback from a recipient, the `rule_set`\\nmust pass. If it does not, a \\\"failure\\\" Feedback Received Event is\\ncreated. When sending feedback to a source, the `rule_set` must pass. If\\nit does not, a \\\" skip\\\" Feedback Sent Event is created.\\n\",\"properties\":{\"rule_set\":{\"description\":\"If the rules fail the feedback is not performed\",\"$ref\":\"#/components/schemas/RuleSet\"},\"integration\":{\"description\":\"The integration to be used for the feedback\",\"$ref\":\"#/components/schemas/Integration\"}},\"additionalProperties\":false,\"required\":[\"integration\"]},\"FeedbackEventVariables\":{\"title\":\"Feedback Event Variables\",\"description\":\"All variables from the most recent event for the lead receiving feedback. Additionally contains\\nfeedback metadata at `feedback.`.\\n\",\"type\":\"object\",\"patternProperties\":{\"^feedback\\\\.\":{\"$ref\":\"#/components/schemas/VariableFeedbackMetadata\"},\"^submission\\\\.\":{\"$ref\":\"#/components/schemas/VariableSubmissionMetadata\"},\"^account\\\\.\":{\"$ref\":\"#/components/schemas/VariableAccountMetadata\"},\"^flow\\\\.\":{\"$ref\":\"#/components/schemas/VariableFlowMetadata\"},\"^source\\\\.\":{\"$ref\":\"#/components/schemas/VariableSourceMetadata\"},\"^recipient\\\\.\":{\"$ref\":\"#/components/schemas/VariableRecipientMetadata\"},\"^lead\\\\.\":{\"$ref\":\"#/components/schemas/VariableLeadData\"},\"^.+\\\\.\":{\"$ref\":\"#/components/schemas/VariableAppendedData\"}},\"additionalProperties\":false},\"feedback-received-event\":{\"allOf\":[{\"$ref\":\"#/components/schemas/EventProperties\"},{\"title\":\"Feedback Received Event\",\"type\":\"object\",\"description\":\"A feedback-received event is created when lead feedback is provided by a recipient. The feedback configuration must be\\nprovided on the recipient step. When feedback is received, all variables are copied from the original recipient event.\\n\\nWhen feedback is configured to be sent to the source, the feedback-received event's `outcome` and `reason` are copied\\nfrom the feedback-sent event. In other words, if the source refuses the feedback, the recipient will receive a \\\"failure\\\"\\noutcome in response to the feedback call.\\n\",\"properties\":{\"type\":{\"description\":\"Recorded after a recipient provides feedback on a lead previously sent with a recipient step\",\"type\":\"string\",\"enum\":[\"feedback-received\"]},\"outcome\":{\"enum\":[\"success\",\"failure\",\"error\"],\"x-enumDescriptions\":{\"success\":\"The recipient was notified in the response that the feedback was accepted\",\"failure\":\"The recipient was notified in the response that the feedback was rejected\",\"error\":\"The recipient was notified in the response that an error occurred while processing the feedback\"}},\"vars\":{\"$ref\":\"#/components/schemas/FeedbackEventVariables\"},\"module_id\":{\"$ref\":\"#/components/schemas/ModuleID\",\"description\":\"The integration module ID configured for the recipient\"},\"recipient_event_id\":{\"$ref\":\"#/components/schemas/EventID\",\"description\":\"The ID of the recipient event used to provide the feedback\"},\"step_id\":{\"type\":\"string\",\"description\":\"The ID flow step that originally sent the lead to the recipient\"},\"feedback\":{\"$ref\":\"#/components/schemas/Feedback\"},\"request\":{\"$ref\":\"#/components/schemas/HttpRequest\",\"description\":\"The feedback HTTP request\"},\"response\":{\"$ref\":\"#/components/schemas/HttpResponse\",\"description\":\"The feedback HTTP response\"}}}]},\"feedback-sent-event\":{\"allOf\":[{\"$ref\":\"#/components/schemas/EventProperties\"},{\"title\":\"Feedback Sent Event\",\"type\":\"object\",\"description\":\"A feedback-sent event is created when lead feedback is sent to a source. The feedback configuration must be provided on\\nthe source in the flow. When feedback is sent, all lead variables are copied from the original recipient event.\\n\",\"properties\":{\"type\":{\"description\":\"Recorded after a feedback is sent to a source as a consequence of the recipient providing feedback\",\"type\":\"string\",\"enum\":[\"feedback-sent\"]},\"outcome\":{\"enum\":[\"success\",\"failure\",\"error\"],\"x-enumDescriptions\":{\"success\":\"The source accepted the feedback\",\"failure\":\"The source rejected the feedback\",\"error\":\"An error occurred while attempting to communicate with the source\"}},\"vars\":{\"$ref\":\"#/components/schemas/FeedbackEventVariables\"},\"module_id\":{\"$ref\":\"#/components/schemas/ModuleID\",\"description\":\"The integration module ID configured for the recipient\"},\"recipient_event_id\":{\"$ref\":\"#/components/schemas/EventID\",\"description\":\"The ID of the recipient event used to provide the feedback\"},\"step_id\":{\"type\":\"string\",\"description\":\"The ID flow step that originally sent the lead to the recipient\"},\"feedback\":{\"$ref\":\"#/components/schemas/Feedback\"},\"request\":{\"$ref\":\"#/components/schemas/HttpRequest\",\"description\":\"The feedback HTTP request\"},\"response\":{\"$ref\":\"#/components/schemas/HttpResponse\",\"description\":\"The feedback HTTP response\"}}}]},\"Field\":{\"x-tags\":[\"Fields\"],\"type\":\"object\",\"summary\":\"Fields define your lead data model in LeadConduit. They specify what information you collect. \\nFields are like columns in your lead database: each field represents a specific piece of information about a lead, \\nfrom basic contact details to complex business-specific data.\\n\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/FieldID\"},\"name\":{\"type\":\"string\",\"description\":\"The human-readable name of the field\",\"examples\":[\"First Name\",\"Last Name\",\"Email\",\"Phone 1\"]},\"type\":{\"description\":\"The data type of this field\",\"$ref\":\"#/components/schemas/TypeName\"},\"description\":{\"type\":\"string\",\"description\":\"The textual description of the purpose of this field\"},\"standard\":{\"description\":\"Read-only flag indicating whether this is a built-in LeadConduit field\",\"type\":\"boolean\"},\"aggregate\":{\"type\":\"boolean\"},\"deprecated\":{\"description\":\"The flag indicating that this field should no longer be used\",\"type\":\"boolean\"},\"see\":{\"$ref\":\"#/components/schemas/FieldID\",\"description\":\"The alternative field ID to be used instead of this deprecated field\"},\"created_at\":{\"description\":\"Read-only time the field was created\",\"$ref\":\"#/components/schemas/Timestamp\"},\"updated_at\":{\"description\":\"Read-only time the field was last updated\",\"$ref\":\"#/components/schemas/Timestamp\"}},\"required\":[\"id\",\"type\",\"name\"]},\"FieldID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The required alphanumeric identifier of the field. Custom fields have an account-specific suffix (e.g. '_acme')\",\"examples\":[\"first_name\",\"last_name\",\"email\",\"phone_1\"]}]},\"filter-event\":{\"allOf\":[{\"$ref\":\"#/components/schemas/EventProperties\"},{\"title\":\"Filter Event\",\"type\":\"object\",\"description\":\"A filter event is created when a lead is processed by a filter step.\\n\",\"properties\":{\"type\":{\"description\":\"Recorded after a filter step in a flow is processed\",\"type\":\"string\",\"enum\":[\"filter\"]},\"outcome\":{\"enum\":[\"continue\",\"stop\",\"error\"],\"x-enumDescriptions\":{\"success\":\"The filter's rule set did not match the lead, and the flow continued\",\"failure\":\"The filter's rule set matched the lead, and the flow stopped\",\"error\":\"An unhandled error occurred while processing the filter step (this indicates a problem with LeadConduit)\"}},\"reason\":{\"type\":\"string\",\"description\":\"Set by evaluating the `reason` template of the filter step.\"},\"vars\":{\"$ref\":\"#/components/schemas/FilterEventVariables\"},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\",\"description\":\"The rule set configured on the recipient step when the lead was processed\"}}}]},\"FilterEventVariables\":{\"title\":\"Filter Event Variables\",\"description\":\"All data available at the time LeadConduit started processing this event\\n\",\"type\":\"object\",\"patternProperties\":{\"^submission\\\\.\":{\"$ref\":\"#/components/schemas/VariableSubmissionMetadata\"},\"^account\\\\.\":{\"$ref\":\"#/components/schemas/VariableAccountMetadata\"},\"^flow\\\\.\":{\"$ref\":\"#/components/schemas/VariableFlowMetadata\"},\"^source\\\\.\":{\"$ref\":\"#/components/schemas/VariableSourceMetadata\"},\"^recipient\\\\.\":{\"$ref\":\"#/components/schemas/VariableRecipientMetadata\"},\"^lead\\\\.\":{\"$ref\":\"#/components/schemas/VariableLeadData\"},\"^.+\\\\.\":{\"$ref\":\"#/components/schemas/VariableAppendedData\"}},\"additionalProperties\":false},\"FilterStep\":{\"title\":\"Filter Step\",\"type\":\"object\",\"description\":\"A filter step is used to stop processing a lead from advancing to the\\nnext flow step. This is conceptually similar to an email inbox filter.\\nIf the lead matches the rules then the flow is stopped, which\\neffectively filters out the lead. When a filter step stops the flow, the\\nsource receives an immediate response and no further steps are\\nprocessed.\\n\",\"properties\":{\"type\":{\"description\":\"The type of the step (always `filter`)\",\"type\":\"string\",\"enum\":[\"filter\"]},\"id\":{\"description\":\"ID for this step\",\"$ref\":\"#/components/schemas/ShortID\"},\"description\":{\"description\":\"A brief description of what this filter does\",\"type\":\"string\",\"maxLength\":120},\"notes\":{\"type\":\"string\",\"maxLength\":2000},\"reason\":{\"$ref\":\"#/components/schemas/Template\",\"description\":\"When the outcome is `failure` or `error`, this is the reason to\\nprovide to the source\\n\"},\"outcome\":{\"description\":\"When the flow stops, `success`, `failure` or `error` is returned to\\nthe source that submitted the lead\\n\",\"type\":\"string\"},\"rule_set\":{\"description\":\"The flow stops when the rules match the lead\",\"$ref\":\"#/components/schemas/RuleSet\"},\"enabled\":{\"description\":\"Whether this step should be run when processing a lead or not\\n\",\"type\":\"boolean\",\"default\":true}},\"additionalProperties\":false,\"required\":[\"type\",\"outcome\",\"rule_set\"]},\"FirehoseAwsServiceConfig\":{\"type\":\"object\",\"description\":\"AWS S3 firehose service configuration\",\"properties\":{\"enabled\":{\"type\":\"boolean\",\"description\":\"Is the AWS S3 firehose enabled?\"},\"credential_id\":{\"description\":\"The ID of the credential storing the AWS keys\",\"$ref\":\"#/components/schemas/CredentialID\"},\"bucket\":{\"type\":\"string\",\"description\":\"The name of the S3 bucket\",\"pattern\":\"^(?=^.{3,63}$)(?!^(\\\\d+\\\\.?)+$)(^(([a-z0-9]|[a-z0-9][a-z0-9\\\\-]*[a-z0-9])\\\\.)*([a-z0-9]|[a-z0-9][a-z0-9\\\\-]*[a-z0-9]))$\"},\"prefix\":{\"type\":\"string\",\"description\":\"Optional. If provided, files written to S3 will be written as &lt;prefix>/&lt;lead id>/&lt;event id>.json\"}},\"required\":[\"credential_id\",\"bucket\",\"enabled\"],\"additionalProperties\":false},\"FirehoseAzureServiceConfig\":{\"type\":\"object\",\"description\":\"Azure Blob Storage firehose service configuration\",\"properties\":{\"enabled\":{\"type\":\"boolean\",\"description\":\"Is the Azure Blob Storage firehose enabled?\"},\"credential_id\":{\"description\":\"The ID of the credential storing the Azure connection string\",\"$ref\":\"#/components/schemas/CredentialID\"},\"bucket\":{\"type\":\"string\",\"description\":\"The name of the Azure Blob Storage container\"},\"connection_string\":{\"type\":\"string\",\"description\":\"The Azure Blob Storage connection string\"},\"prefix\":{\"type\":\"string\",\"description\":\"Optional. If provided, files written to Azure will be written as &lt;prefix>/&lt;lead id>/&lt;event id>.json\"}},\"required\":[\"credential_id\",\"bucket\",\"enabled\"],\"additionalProperties\":false},\"Firehose\":{\"type\":\"object\",\"description\":\"Firehose configuration for exporting event data to cloud storage. Supports a legacy flat format (AWS S3 only) and a service-based format that allows multiple cloud storage providers.\\n\",\"properties\":{\"enabled\":{\"type\":\"boolean\",\"description\":\"Is the firehose enabled for this flow?\"},\"credential_id\":{\"description\":\"The ID of the credential storing the AWS keys (legacy format)\",\"$ref\":\"#/components/schemas/CredentialID\"},\"bucket\":{\"type\":\"string\",\"description\":\"The name of the S3 bucket (legacy format)\",\"pattern\":\"^(?=^.{3,63}$)(?!^(\\\\d+\\\\.?)+$)(^(([a-z0-9]|[a-z0-9][a-z0-9\\\\-]*[a-z0-9])\\\\.)*([a-z0-9]|[a-z0-9][a-z0-9\\\\-]*[a-z0-9]))$\"},\"prefix\":{\"type\":\"string\",\"description\":\"Optional. If provided, files written to S3 will be written as &lt;prefix>/&lt;lead id>/&lt;event id>.json (legacy format)\"},\"services\":{\"type\":\"object\",\"description\":\"Service-based configuration allowing multiple cloud storage providers\",\"properties\":{\"aws\":{\"$ref\":\"#/components/schemas/FirehoseAwsServiceConfig\"},\"azure\":{\"$ref\":\"#/components/schemas/FirehoseAzureServiceConfig\"}},\"additionalProperties\":false}},\"required\":[\"enabled\"]},\"Flow\":{\"x-tags\":[\"Flows\"],\"type\":\"object\",\"summary\":\"Flows define the complete processing pipeline for lead submissions, from data ingestion through delivery. \\nEach flow creates a configurable handler that processes leads through a series of middleware steps in sequence.\\n\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/FlowID\"},\"name\":{\"type\":\"string\",\"description\":\"The name of the flow\",\"minLength\":1,\"example\":\"Sales Leads\"},\"errors\":{\"type\":\"object\",\"description\":\"Errors preventing this flow from being saved\",\"readOnly\":true},\"enabled\":{\"type\":\"boolean\",\"description\":\"Disabling a flow will prevent any processing of lead submissions. Submission will result in an error outcome.\",\"example\":true},\"fields\":{\"type\":\"array\",\"description\":\"The list of fields (IDs) representing the lead to be processed by this flow.\",\"items\":{\"$ref\":\"#/components/schemas/FieldID\"},\"example\":[\"first_name\",\"last_name\",\"email\",\"phone_1\",\"address_1\",\"city\",\"state\",\"postal_code\",\"trustedform_cert_url\"]},\"caps\":{\"$ref\":\"#/components/schemas/Caps\",\"description\":\"Caps on leads submitted into this flow from any source. These caps will be processed before caps set on a source.\"},\"acceptance_criteria\":{\"$ref\":\"#/components/schemas/acceptance-criteria\",\"description\":\"A submitted lead that fails an acceptance criteria rule will be rejected. Lead submission will result in a failure outcome.\"},\"pricing\":{\"$ref\":\"#/components/schemas/Pricing\",\"description\":\"This pricing configuration applies to all leads submitted to this flow. Pricing determines the value of \\nthe `purchase_price` and `cost` property on the source event recorded when a lead is submitted. \\n\\nEach price is evaluated and the last price for which all rules match will determine the amount used\\nfor the `purchase_price` and `cost`. If none of these prices match for a particular lead, source pricing\\nwill be evaluated. If no price matches, the price properties on the source event will be set to `0`.\\n\"},\"list_checks\":{\"$ref\":\"#/components/schemas/ListChecks\"},\"destinations\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Destination\"}},\"sources\":{\"type\":\"array\",\"description\":\"Flows accommodate multiple lead sources. Each source has:\\n- **Entity reference** - Identifies the submitting party\\n- **Inbound mappings** - Field name transformations specific to that source\\n- **Authentication settings** - Credentials and security requirements\\n- **Acceptance Criteria** - Source-specific rules that must pass in order to continue processing a lead \\n- **Pricing configuration** - Source-specific cost calculations\\n- **Caps** - Source-specific caps\\n\",\"items\":{\"$ref\":\"#/components/schemas/Source\"}},\"steps\":{\"type\":\"array\",\"description\":\"After executing acceptance criteria, caps, and pricing, for the source and flow, steps are\\nprocessed in order sequentially.\\n\",\"items\":{\"$ref\":\"#/components/schemas/Step\"}},\"ping_enabled\":{\"type\":\"boolean\",\"default\":false},\"ping_limits\":{\"$ref\":\"#/components/schemas/PingLimits\"},\"pricing_service\":{\"$ref\":\"#/components/schemas/PricingServiceConfiguration\"},\"firehose\":{\"$ref\":\"#/components/schemas/Firehose\"},\"level\":{\"type\":\"string\",\"description\":\"The level of the flow, e.g. 'minimal' for buyer accounts\",\"readOnly\":true},\"created_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"readOnly\":true},\"updated_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"readOnly\":true}},\"additionalProperties\":false,\"required\":[\"enabled\",\"name\",\"fields\",\"sources\",\"steps\"]},\"FlowID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier for a flow\",\"example\":\"5fd4371e940df5a34a3888b2\"}]},\"Headers\":{\"type\":\"object\",\"patternProperties\":{\"[A-Za-z0-9_\\\\\\\\-~\\\\\\\\{\\\\\\\\}]+\":{\"type\":\"string\",\"minLength\":1}},\"additionalProperties\":false},\"HttpRequest\":{\"type\":\"object\",\"properties\":{\"method\":{\"type\":\"string\",\"description\":\"HTTP request method\",\"enum\":[\"GET\",\"POST\",\"PUT\",\"DELETE\",\"PATCH\",\"OPTIONS\"],\"example\":\"POST\"},\"uri\":{\"type\":\"string\",\"description\":\"The full URI\",\"format\":\"uri\",\"example\":\"https://app.leadconduit.com/flows/5fd4371e940df5a34a3888b2/sources/6369a0e534c9d4ebe142e0ef/submit\"},\"version\":{\"type\":\"string\",\"description\":\"The HTTP version used\",\"example\":\"1.1\"},\"headers\":{\"$ref\":\"#/components/schemas/Headers\",\"description\":\"The headers sent on the request\",\"example\":{\"Content-Type\":\"application/json\",\"Accept\":\"application/json\"}},\"body\":{\"type\":\"string\",\"description\":\"The contents of the request body\",\"example\":\"{\\\"email\\\":\\\"johndoe@email.com\\\",\\\"phone_1\\\":\\\"5127891111\\\"}\"},\"timestamp\":{\"type\":\"integer\",\"description\":\"The number of milliseconds elapsed since epoch immediately prior to sending the request\"}},\"required\":[\"method\",\"uri\",\"version\",\"headers\",\"body\",\"timestamp\"],\"additionalProperties\":false},\"HttpResponse\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"integer\",\"description\":\"HTTP status code\",\"example\":201},\"status_text\":{\"type\":\"string\",\"description\":\"The textual representation of the status\",\"format\":\"uri\",\"example\":\"Created\"},\"version\":{\"type\":\"string\",\"description\":\"The HTTP version used\",\"example\":\"1.1\"},\"headers\":{\"$ref\":\"#/components/schemas/Headers\",\"description\":\"The headers sent in the response\",\"example\":{\"Content-Type\":\"application/json\",\"Accept\":\"application/json\"}},\"body\":{\"type\":\"string\",\"description\":\"The contents of the response body\",\"example\":\"{\\\"outcome\\\":\\\"success\\\",\\\"lead\\\":{\\\"id\\\":\\\"63cc6f0e55254d7d1c4c3037\\\"}}\"},\"timestamp\":{\"type\":\"integer\",\"description\":\"The number of milliseconds elapsed since epoch immediately after reading the response body\"}},\"required\":[\"method\",\"uri\",\"version\",\"headers\",\"body\",\"timestamp\"]},\"ID\":{\"type\":\"string\",\"description\":\"24 character alpha-numeric BSON identifier\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"readOnly\":true,\"example\":\"5fd4371e940df5a34a3888b2\"},\"Integration\":{\"type\":\"object\",\"properties\":{\"module_id\":{\"description\":\"A pointer to the integration code to use for this integration\\n\",\"$ref\":\"#/components/schemas/ModuleID\"},\"mappings\":{\"description\":\"The mappings to apply to lead data when interacting with this\\nintegration\\n\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Mapping\"}}},\"additionalProperties\":false,\"required\":[\"module_id\"]},\"IntegrationModule\":{\"title\":\"Integration Module\",\"description\":\"An integration module is a pointer to the code that executes an\\nindividual inbound or outbound integration. A module is contained in an\\nintegration package. For example, the Salesforce [integration\\npackage](#integration-package) contains two individual\\nintegration modules: Add Lead and Create Contact.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ModuleID\"},\"type\":{\"description\":\"The type of the integration module\",\"type\":\"string\",\"examples\":[\"inbound\",\"delivery\",\"marketplace enhancement\",\"enhancement\",\"recipient\",\"source\"]},\"direction\":{\"description\":\"The type of the integration module\",\"type\":\"string\",\"enum\":[\"inbound\",\"outbound\"]},\"name\":{\"description\":\"The name of the integration inside the integration module\",\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"tag\":{\"type\":\"string\"},\"feedback\":{\"type\":\"boolean\"},\"median_wait_ms\":{\"type\":\"number\"},\"pricing\":{\"type\":\"object\",\"properties\":{\"type\":{\"type\":\"string\"},\"unit\":{\"type\":\"string\"},\"transaction\":{\"type\":\"boolean\"},\"tiers\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"unit_price\":{\"type\":\"number\"},\"start_qty\":{\"type\":\"number\"},\"end_qty\":{\"type\":\"number\"}}}}}},\"request_variables\":{\"description\":\"The fields provided by an inbound integration, or fields provided to an outbound integration\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/IntegrationVariable\"}},\"response_variables\":{\"description\":\"The fields returned by an inbound integration, or fields appended by an outbound integration\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/IntegrationVariable\"}},\"entity_id\":{\"description\":\"The entity associated with this integration module\",\"$ref\":\"#/components/schemas/ID\"},\"editable\":{\"description\":\"If the module allows configuration updates though its UI wizard\",\"type\":\"boolean\"}}},\"IntegrationPackage\":{\"description\":\"An integration package contains multiple integration modules.\\n\",\"type\":\"object\",\"title\":\"Integration Package\",\"properties\":{\"id\":{\"type\":\"string\",\"description\":\"The unique identifier of the integration package\",\"example\":\"leadconduit-salesforce\"},\"provider\":{\"type\":\"string\",\"description\":\"The name of the provider of the integration package\",\"example\":\"Salesforce\"},\"description\":{\"description\":\"The human readable description of the integration package\",\"type\":\"string\"},\"name\":{\"description\":\"The name of the package (i.e. Salesforce)\",\"type\":\"string\"},\"paths\":{\"description\":\"An array of pointers to each integration inside this package\",\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"link\":{\"description\":\"The provider's homepage\",\"type\":\"string\"},\"ui\":{\"description\":\"Whether this integration supports a rich user experience\",\"type\":\"boolean\"},\"images\":{\"type\":\"boolean\"},\"version\":{\"description\":\"The semantic version of the package containing this integration\",\"type\":\"string\"},\"integrations\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/IntegrationModule\"}}}},\"IntegrationVariable\":{\"description\":\"Variables are used when communicating with integrations.\\n\\nOutbound integrations have a list of request variables. These are the\\nvariables provided to the integration for the purpose of executing an\\noutbound integration as part of a [recipient step](#recipient-step).\\nOutbound integrations also provide a list of response variables. These\\nare the variables the integration provides after the integration is\\nexecuted. They are appended to the full list of [lead\\nvariables](#lead-variable) available while handling a lead.\\n\\nInbound integrations have a list of request variables. These are the\\nvariables that are populated by the inbound integration when a lead is\\nsubmitted to LeadConduit. These variables are [mapped](#mapping) and\\nthe results are stored in the [lead variables](#lead-variable) for use\\nwhile processing the lead. The response variables for an inbound\\nintegration represent the data returned to the submitting party by the\\ninbound integration after lead processing has completed.\\n\",\"type\":\"object\",\"properties\":{\"name\":{\"description\":\"The identifier of the variable (i.e. lead.first_name)\",\"type\":\"string\"},\"description\":{\"description\":\"The human readable description of the variable\",\"type\":\"string\"},\"required\":{\"description\":\"Whether or not the variable is required by the integration\",\"type\":\"boolean\"},\"type\":{\"description\":\"The type of data contained in the variable\",\"type\":\"string\"}},\"required\":[\"name\"]},\"InvitationID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier of an invitation\"}]},\"InvitationRequest\":{\"x-tags\":[\"Invitation\"],\"oneOf\":[{\"type\":\"object\",\"title\":\"Invitation by Email\",\"properties\":{\"email\":{\"type\":\"string\",\"description\":\"Email address to send invitation to\",\"example\":\"mike.jones@example.com\"},\"description\":{\"type\":\"string\",\"description\":\"Optional description for the invitation\"}},\"required\":[\"email\"],\"additionalProperties\":false},{\"type\":\"object\",\"title\":\"Invitation by Entity ID\",\"properties\":{\"entity_id\":{\"type\":\"string\",\"description\":\"Existing entity ID to use for the invitation\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7a8\"},\"description\":{\"type\":\"string\",\"description\":\"Optional description for the invitation\"}},\"required\":[\"entity_id\"],\"additionalProperties\":false}]},\"InvitationSuccessResponse\":{\"type\":\"object\",\"properties\":{\"message\":{\"type\":\"string\",\"description\":\"Message in case the invitation was sent successfully\",\"example\":\"Invitation was sent successfully\"},\"entity\":{\"type\":\"object\",\"$ref\":\"#/components/schemas/Entity\",\"description\":\"Pending source or recipient entity created with the invitation id returned from Accounts invitations\"}}},\"InvitationErrorResponse\":{\"$ref\":\"#/components/schemas/LCError\"},\"LCError\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"integer\",\"description\":\"HTTP status code\",\"enum\":[400,401,403,404,409,422,429,500],\"example\":400},\"type\":{\"type\":\"string\",\"description\":\"HTTP status text corresponding to the status code\",\"example\":\"Bad Request\"},\"title\":{\"type\":\"string\",\"description\":\"Error name/title\",\"example\":\"LCError\"},\"detail\":{\"type\":\"string\",\"description\":\"Error message describing what went wrong\",\"example\":\"Invalid request parameters\"},\"errors\":{\"type\":\"array\",\"description\":\"Array of validation errors with specific field details (empty array if no field-specific errors)\",\"items\":{\"type\":\"object\",\"properties\":{\"pointer\":{\"type\":\"string\",\"description\":\"JSON pointer to the field that caused the error\",\"example\":\"#/email\"},\"message\":{\"type\":\"string\",\"description\":\"Specific error message for this field\",\"example\":\"Email is required\"}},\"required\":[\"pointer\",\"message\"]}}},\"required\":[\"status\",\"type\",\"title\",\"detail\",\"errors\"],\"example\":{\"status\":400,\"type\":\"Bad Request\",\"title\":\"LCError\",\"detail\":\"Invalid request parameters\",\"errors\":[{\"pointer\":\"#/entity_id\",\"message\":\"Invalid entity ID format\"}]}},\"LeadID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier for a lead\",\"example\":\"686a02d137f16f2cb814af15\"}]},\"lead-search-result\":{\"title\":\"Lead Search Result\",\"type\":\"object\",\"description\":\"A lead search result is returned when searching for a lead. The\\nresponse from the `/search/leads` endpoint contains the total number of\\nmatching leads and an array of hits, where each hit is a lead search\\nresult. Each lead search result contains the following properties\\n\",\"properties\":{\"lead_id\":{\"$ref\":\"#/components/schemas/LeadID\",\"description\":\"Unique ID of the lead\"},\"flow_id\":{\"$ref\":\"#/components/schemas/FlowID\",\"description\":\"Unique ID of the flow\"},\"flow_name\":{\"description\":\"Name of the flow\",\"type\":\"string\",\"minLength\":1,\"example\":\"Sales Leads\"},\"source_id\":{\"$ref\":\"#/components/schemas/EntityID\",\"description\":\"Unique ID of the source\"},\"source_name\":{\"description\":\"Name of the source\",\"type\":\"string\",\"example\":\"A Corporation\"},\"first_name\":{\"description\":\"First name\",\"type\":\"string\",\"example\":\"George\"},\"last_name\":{\"description\":\"Last name\",\"type\":\"string\",\"example\":\"Washington\"},\"email\":{\"description\":\"Email address\",\"type\":\"string\",\"example\":\"georgew@gmail.com\"},\"phone_1\":{\"description\":\"Phone number\",\"type\":\"string\",\"example\":\"5125551212\"},\"phone_2\":{\"description\":\"Alternate phone number\",\"type\":\"string\",\"example\":\"5125552222\"},\"address_1\":{\"description\":\"Street address\",\"type\":\"string\",\"example\":\"123 Main street\"},\"city\":{\"description\":\"City\",\"type\":\"string\",\"example\":\"Austin\"},\"postal_code\":{\"description\":\"Zip code\",\"type\":\"string\",\"example\":\"78704\"},\"reference\":{\"description\":\"Vendor specific information\",\"type\":\"string\",\"example\":\"1990118214561\"},\"state\":{\"description\":\"State abbreviation\",\"type\":\"string\",\"example\":\"TX\"},\"submission_timestamp\":{\"description\":\"Time the lead was submitted\",\"$ref\":\"#/components/schemas/Timestamp\"},\"highlight\":{\"description\":\"Object containing properties for each matching field. The values of\\nthe properties are arrays of the matching text, wrapped in `<em>\\ntags\\n\",\"type\":\"object\",\"additionalProperties\":true},\"latest_event\":{\"description\":\"Last event recorded for this lead\",\"$ref\":\"#/components/schemas/recipient-event\"}}},\"ListCheck\":{\"type\":\"object\",\"properties\":{\"value\":{\"$ref\":\"#/components/schemas/Template\",\"description\":\"Is this value on the list? ([templating](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/) is supported)\"},\"list_name\":{\"description\":\"The name of the SuppressionList list to check\",\"type\":\"string\",\"minLength\":1},\"lookback\":{\"anyOf\":[{\"description\":\"Only query for the value in the list this far back\",\"type\":\"null\"},{\"description\":\"Only query for the value in the list this far back\",\"type\":\"object\",\"properties\":{\"value\":{\"description\":\"The number of units that define the look-back window\",\"type\":\"number\"},\"interval\":{\"description\":\"Each unit defined in the `value` is one of these durations\",\"type\":\"string\",\"enum\":[\"year\",\"month\",\"week\",\"day\",\"hour\",\"minute\"]}},\"additionalProperties\":false,\"required\":[\"value\",\"interval\"]}]}}},\"ListChecks\":{\"description\":\"Check the lead against SuppressionList lists to see if it's a duplicate, and existing customer, or is on the\\ndo-not-call list.\\n\",\"type\":\"object\",\"properties\":{\"duplicate\":{\"$ref\":\"#/components/schemas/ListCheck\",\"description\":\"Query a SuppressionList to determine if the lead is a on the duplicate list (use `suppressionlist.is_duplicate` rules)\",\"example\":{\"value\":\"{{lead.phone}}\",\"list_name\":\"duplicates\",\"lookback\":{\"value\":7,\"interval\":\"day\"}}},\"existing_customer\":{\"$ref\":\"#/components/schemas/ListCheck\",\"description\":\"Query a SuppressionList to determine if the lead is a on the list of existing customers (use `suppressionlist.is_existing_customer` rules)\",\"example\":{\"value\":\"{{lead.email}}\",\"list_name\":\"customer_emails\",\"lookback\":null}},\"dnc\":{\"$ref\":\"#/components/schemas/ListCheck\",\"description\":\"Query a SuppressionList to determine if the lead is on the do-not-call list (use `suppressionlist.is_dnc` rules)\",\"example\":{\"value\":\"{{lead.phone}}\",\"list_name\":\"do_not_call\",\"lookback\":null}}},\"additionalProperties\":false},\"Mapping\":{\"description\":\"Mappings transform data between systems using rule-based translations. They handle field renaming, data restructuring, and conditional transformations for both inbound (sources) and outbound (recipients) data.\\n\\n## Core Structure\\n\\nEach mapping has three components:\\n1. **Property**: Destination field name\\n2. **Value**: Template-based value assignment\\n3. **Rule Set**: Optional conditions for application\\n\\n```json\\n{\\n  \\\"property\\\": \\\"full_name\\\",\\n  \\\"value\\\": \\\"{{lead.first_name}} {{lead.last_name}}\\\",\\n  \\\"rule_set\\\": {\\n    \\\"op\\\": \\\"and\\\",\\n    \\\"rules\\\": [{\\\"lhv\\\": \\\"lead.state\\\", \\\"op\\\": \\\"is equal to\\\", \\\"rhv\\\": \\\"TX\\\"}]\\n  }\\n}\\n```\\n\\n## Inbound vs Outbound Mapping\\n\\n### Inbound Mapping (Source → LeadConduit)\\n**Purpose**: Standardize field names during lead submission\\n**Context**: Raw submission data before the lead object exists\\n**Use Case**: Only needed when source field names don't match LeadConduit standards\\n\\n**Technical Detail**: Inbound mappings execute in the handler before the lead object is created. Templates can only reference raw submission fields (not `lead.field` syntax). The `lead.` prefix in properties tells the system to assign values to the lead object that will be created after mapping.\\n\\n```json\\n// Source sends non-standard names\\n[\\n  {\\\"property\\\": \\\"lead.first_name\\\", \\\"value\\\": \\\"{{fname}}\\\"},\\n  {\\\"property\\\": \\\"lead.email\\\", \\\"value\\\": \\\"{{email_addr}}\\\"}\\n]\\n```\\n\\n**Key Rules**:\\n- Use exact source field names in value templates (no `lead.` prefix)\\n- Use LeadConduit field IDs in property templates (with `lead.` prefix)\\n- Don't transform data - let type system handle normalization\\n- Field renaming only\\n\\n### Outbound Mapping (LeadConduit → Recipient)\\n**Purpose**: Transform processed data for recipient requirements\\n**Context**: Complete lead data with all type components, all appended data\\n**Use Case**: Format data, combine fields, extract components\\n\\n```json\\n[\\n  {\\\"property\\\": \\\"FullName\\\", \\\"value\\\": \\\"{{lead.first_name}} {{lead.last_name}}\\\"},\\n  {\\\"property\\\": \\\"FormattedPhone\\\", \\\"value\\\": \\\"({{lead.phone_1.area}}) {{lead.phone_1.exchange}}-{{lead.phone_1.line}}\\\"},\\n  {\\\"property\\\": \\\"EmailDomain\\\", \\\"value\\\": \\\"{{lead.email.domain}}\\\"}\\n]\\n```\\n\\n**Key Rules**:\\n- Use LeadConduit field IDs in templates\\n- Leverage field value's components provided by the field's type\\n- Transform data for recipient needs\\n- Use conditional logic for business rules\\n\\n## Property Path Syntax\\n\\n**Simple**: `\\\"email\\\"`\\n**Nested**: `\\\"contact.primary.email\\\"` → `{contact: {primary: {email: \\\"value\\\"}}}`\\n**Arrays**: `\\\"phones.0\\\"` → `{phones: [\\\"value\\\"]}`\\n**Special Keys**: `\\\"data{2024}.revenue\\\"` → `{data: {\\\"2024\\\": {revenue: \\\"value\\\"}}}`\\n\\n## Template Features\\n\\n**Field Access**: `{{lead.email}}`\\n**Components**: `{{lead.phone_1.area}}`\\n**Formatting**: `{{format lead.dob format=\\\"MM/DD/YYYY\\\"}}`\\n**Calculations**: `{{math lead.loan_amount * 1.05}}`\\n**Combinations**: `{{lead.first_name}} {{lead.last_name}}`\\n\\n## Common Patterns\\n\\n**Basic Field Renaming (Inbound)**:\\n```json\\n[\\n  {\\\"property\\\": \\\"lead.first_name\\\", \\\"value\\\": \\\"{{fname}}\\\"},\\n  {\\\"property\\\": \\\"lead.email\\\", \\\"value\\\": \\\"{{email_address}}\\\"}\\n]\\n```\\n\\n**Field Combining (Outbound)**:\\n```json\\n{\\\"property\\\": \\\"FullName\\\", \\\"value\\\": \\\"{{lead.first_name}} {{lead.last_name}}\\\"}\\n```\\n\\n**Conditional Fields**:\\n```json\\n{\\n  \\\"property\\\": \\\"premium_lead\\\",\\n  \\\"value\\\": \\\"true\\\",\\n  \\\"rule_set\\\": {\\n    \\\"op\\\": \\\"and\\\",\\n    \\\"rules\\\": [\\n      {\\\"lhv\\\": \\\"lead.annual_income\\\", \\\"op\\\": \\\"is greater than\\\", \\\"rhv\\\": \\\"100000\\\"}\\n    ]\\n  }\\n}\\n```\\n\\n**Static Field Value**:\\n```json\\n{\\n  \\\"property\\\": \\\"aff_id\\\",\\n  \\\"value\\\": \\\"aff-103331\\\",\\n}\\n```\\n\\n**Nested Structures**:\\n```json\\n[\\n  {\\\"property\\\": \\\"applicant.name.first\\\", \\\"value\\\": \\\"{{lead.first_name}}\\\"},\\n  {\\\"property\\\": \\\"applicant.contact.email\\\", \\\"value\\\": \\\"{{lead.email}}\\\"}\\n]\\n```\\n\\n**Conditional Field Value Based on Precedence**:\\n```json\\n[\\n  {\\n    \\\"property\\\": \\\"best_phone\\\",\\n    \\\"value\\\": \\\"{{lead.phone_2}}\\\",\\n    \\\"rule_set\\\": {\\\"rules\\\": [{\\\"lhv\\\": \\\"lead.phone_2.valid\\\", \\\"op\\\": \\\"is true\\\"}]}\\n  },\\n  {\\n    \\\"property\\\": \\\"best_phone\\\",\\n    \\\"value\\\": \\\"{{lead.phone_1}}\\\",\\n    \\\"rule_set\\\": {\\\"rules\\\": [{\\\"lhv\\\": \\\"lead.phone_1.valid\\\", \\\"op\\\": \\\"is true\\\"}]}\\n  }\\n]\\n```\\n\\n## Special Behaviors\\n\\n**Processing Order**: Mappings apply sequentially, allowing overwrites\\n**Empty Values**: Template results that are empty are skipped; explicit empty strings are applied\\n**Type Preservation**: Simple variable templates preserve data types; string concatenation converts to string\\n**Error Recovery**: Individual mapping failures don't stop processing\\n\\n## Best Practices\\n\\n**Inbound**: Only map fields with different names; let type system handle normalization; use simple templates\\n**Outbound**: Use type components instead of string parsing; make property names self-documenting; test edge cases\\n**Performance**: Order rules efficiently; minimize complex templates; group related mappings\\n\\n## Common Pitfalls\\n\\n### Pitfall: Transforming on Inbound\\n❌ **Wrong**:\\n```json\\n{\\n  \\\"property\\\": \\\"lead.email\\\",\\n  \\\"value\\\": \\\"{{lowercase email_address}}\\\"  // Don't do this!\\n}\\n```\\n✅ **Right**:\\n```json\\n{\\n  \\\"property\\\": \\\"lead.email\\\",\\n  \\\"value\\\": \\\"{{email_address}}\\\"  // Type system handles lowercasing\\n}\\n```\\n\\n### Pitfall: Using Wrong Field Names\\n❌ **Wrong**:\\n```json\\n// In outbound mapping:\\n{\\n  \\\"value\\\": \\\"{{lead.phone_1.area}}\\\"  // Backend syntax\\n}\\n```\\n✅ **Right**:\\n```json\\n{\\n  \\\"value\\\": \\\"{{Phone 1 > Area}}\\\"  // UI display name with component\\n}\\n```\\n\\n### Pitfall: Over-Mapping\\n❌ **Wrong**: Mapping fields that already match\\n```json\\n// If source sends \\\"email\\\", don't do this:\\n{ \\\"property\\\": \\\"lead.email\\\", \\\"value\\\": \\\"{{email}}\\\" }  // Unnecessary!\\n```\\n✅ **Right**: Only map when names differ\\n\\n### Pitfall: String Manipulation Instead of Components\\n❌ **Wrong**:\\n```json\\n{\\n  \\\"property\\\": \\\"area_code\\\",\\n  \\\"value\\\": \\\"{{substring Phone 1 start=1 end=4}}\\\"\\n}\\n```\\n✅ **Right**:\\n```json\\n{\\n  \\\"property\\\": \\\"area_code\\\",\\n  \\\"value\\\": \\\"{{Phone 1 > Area}}\\\"\\n}\\n```\\n\\n## Integration\\n\\n**With Types**: Inbound mappings happen before type conversion, outbound after\\n**With Rules**: Control when mappings apply based on business logic\\n**With Templates**: Provide dynamic values from lead data and components\",\"type\":\"object\",\"properties\":{\"id\":{\"description\":\"ID for this mapping\",\"$ref\":\"#/components/schemas/ShortID\"},\"property\":{\"description\":\"The name of the variable to set\",\"type\":\"string\",\"minLength\":1},\"value\":{\"description\":\"The value to set\",\"oneOf\":[{\"$ref\":\"#/components/schemas/Template\"},{\"type\":\"number\"},{\"type\":\"null\"},{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/components/schemas/Template\"},{\"type\":\"null\"}]},\"minItems\":1}]},\"rule_set\":{\"description\":\"Only apply the mapping if this rule set passes\",\"$ref\":\"#/components/schemas/RuleSet\"}},\"additionalProperties\":false,\"required\":[\"property\",\"value\"]},\"Meta\":{\"x-tags\":[\"Flows\"],\"type\":\"object\",\"properties\":{\"enabled\":{\"type\":\"boolean\",\"example\":true},\"account\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\",\"example\":\"53a310fa9d29c9c72100006c\"},\"name\":{\"type\":\"string\",\"example\":\"ActiveProspect, Inc.\"}}},\"flow\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\",\"readOnly\":true},\"name\":{\"type\":\"string\",\"readOnly\":true}}},\"source\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\",\"readOnly\":true},\"name\":{\"type\":\"string\",\"readOnly\":true},\"authentication_required\":{\"type\":\"boolean\",\"example\":false}}},\"hours_of_operation\":{\"type\":\"object\",\"additionalProperties\":true},\"acceptance_criteria\":{\"description\":\"A submitted lead that fails an acceptance criteria rule will be rejected. Lead submission will result in a failure outcome.\",\"$ref\":\"#/components/schemas/acceptance-criteria\"},\"flow_acceptance_criteria\":{\"type\":\"object\",\"additionalProperties\":true},\"params\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"example\":\"first_name\"},\"label\":{\"type\":\"string\",\"example\":\"First Name\"},\"description\":{\"type\":\"string\",\"example\":\"First name\"},\"type\":{\"type\":\"string\",\"example\":\"first_name\"},\"variable\":{\"oneOf\":[{\"type\":\"null\"},{\"type\":\"string\"}],\"example\":\"first_name\"},\"examples\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"example\":[\"Mike\",\"Robert\",\"Janet\"]},\"required\":{\"type\":\"string\",\"enum\":[\"yes\",\"no\"],\"example\":\"no\"}},\"required\":[\"name\",\"label\",\"description\",\"type\",\"variable\",\"required\"]}},\"flow_pricing\":{\"oneOf\":[{\"type\":\"null\"},{\"type\":\"object\"}],\"example\":null},\"flow_pricing_service\":{\"$ref\":\"#/components/schemas/PricingServiceConfiguration\"},\"source_pricing\":{\"oneOf\":[{\"type\":\"null\"},{\"type\":\"object\"}],\"example\":null},\"source_pricing_service\":{\"$ref\":\"#/components/schemas/PricingServiceConfiguration\"},\"pingable\":{\"type\":\"boolean\",\"example\":true},\"ping_enabled\":{\"type\":\"boolean\",\"example\":false},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"example\":\"2025-03-20T15:06:01.777Z\"},\"authorized_account\":{\"type\":\"boolean\",\"example\":true}},\"required\":[\"enabled\",\"account\",\"flow\",\"source\",\"params\",\"pingable\",\"ping_enabled\",\"updated_at\",\"authorized_account\"]},\"ModuleID\":{\"title\":\"Integration Module ID\",\"type\":\"string\",\"description\":\"The unique identifier of the integration module\",\"example\":\"leadconduit-salesforce.outbound.create_contact\"},\"NotAuthorized\":{\"type\":\"object\",\"properties\":{\"error\":{\"type\":\"string\",\"example\":\"not authorized\"}}},\"Oauth1Credential\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/CredentialID\"},\"name\":{\"description\":\"Friendly name for this credential\",\"type\":\"string\"},\"package\":{\"description\":\"The name of the LeadConduit integration package to which this credential belongs\",\"type\":\"string\"},\"type\":{\"description\":\"The credential type\",\"type\":\"string\",\"enum\":[\"oauth1\"]},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"consumer_key\":{\"description\":\"The OAuth 1.0 consumer key\",\"type\":\"string\",\"minLength\":1},\"consumer_secret\":{\"description\":\"The OAuth 1.0 consumer secret\",\"type\":\"string\",\"minLength\":1},\"token_key\":{\"description\":\"The OAuth 1.0 token key\",\"type\":\"string\",\"minLength\":1},\"access_token\":{\"description\":\"The OAuth 1.0 access token\",\"type\":\"string\",\"minLength\":1},\"realm\":{\"description\":\"The OAuth 1.0 realm\",\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"package\",\"type\",\"consumer_key\",\"consumer_secret\",\"token_key\",\"access_token\"],\"additionalProperties\":true},\"Oauth2Credential\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/CredentialID\"},\"name\":{\"description\":\"Friendly name for this credential\",\"type\":\"string\"},\"package\":{\"description\":\"The name of the LeadConduit integration package to which this credential belongs\",\"type\":\"string\"},\"type\":{\"description\":\"The credential type\",\"type\":\"string\",\"enum\":[\"oauth2\"]},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"access_token\":{\"description\":\"The OAuth 2.0 access token\",\"type\":\"string\",\"minLength\":1},\"refresh_token\":{\"description\":\"The OAuth 2.0 refresh token used to obtain a new access token\",\"type\":\"string\",\"minLength\":1},\"expires_at\":{\"description\":\"The time in epoch milliseconds at which the access token will expire\",\"type\":\"integer\",\"format\":\"int64\"},\"environment\":{\"description\":\"The environment for the OAuth connection (e.g. production, sandbox)\",\"type\":\"string\"},\"user\":{\"description\":\"The user the credential belongs to\",\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"username\":{\"type\":\"string\"},\"first_name\":{\"type\":\"string\"},\"last_name\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"},\"phone\":{\"type\":\"string\"}}},\"org\":{\"description\":\"The organization the credential belongs to\",\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"prefix\":{\"type\":\"string\"}}}},\"required\":[\"id\",\"name\",\"package\",\"type\",\"access_token\"],\"additionalProperties\":true},\"Onboard\":{\"type\":\"object\",\"description\":\"An onboard record tracks the onboarding process for a buyer connection\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"account_id\":{\"type\":\"string\",\"description\":\"The account ID that owns this onboard\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7a8\"},\"invitation_id\":{\"type\":\"string\",\"description\":\"The invitation ID associated with this onboard\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7a9\"},\"connection_id\":{\"type\":\"string\",\"description\":\"The connection ID used for the onboard (retrieved from the invitation)\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7aa\"},\"flow_id\":{\"type\":\"string\",\"description\":\"The flow ID to be used for the onboard (normally the minimal flow)\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7ab\"},\"status\":{\"type\":\"string\",\"description\":\"Current status of the onboard process, recommended values are: created, in_progress, completed\",\"example\":\"created\"},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Timestamp when the onboard was created\",\"readOnly\":true},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Timestamp when the onboard was last updated\",\"readOnly\":true}},\"required\":[\"invitation_id\"]},\"OnboardCreateRequest\":{\"type\":\"object\",\"description\":\"Request body for creating a new onboard\",\"properties\":{\"invitation_id\":{\"type\":\"string\",\"description\":\"The invitation ID to create the onboard from\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7a8\"},\"flow_id\":{\"type\":\"string\",\"description\":\"Optional. The flow ID to use for the onboard if the UI already has it\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7ab\"}},\"required\":[\"invitation_id\"]},\"OnboardBuyerRequest\":{\"description\":\"Request body for completing buyer onboarding setup. Either connection_id or invitation_id must be provided.\",\"oneOf\":[{\"type\":\"object\",\"title\":\"By Connection ID\",\"properties\":{\"connection_id\":{\"type\":\"string\",\"description\":\"The connection ID for the buyer setup\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7a8\"},\"flow_id\":{\"type\":\"string\",\"description\":\"Optional. The existing flow ID to use for buyer delivery\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7aa\"}},\"required\":[\"connection_id\"],\"additionalProperties\":false},{\"type\":\"object\",\"title\":\"By Invitation ID\",\"properties\":{\"invitation_id\":{\"type\":\"string\",\"description\":\"The invitation ID for the buyer setup\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7a9\"},\"flow_id\":{\"type\":\"string\",\"description\":\"Optional. The existing flow ID to use for buyer delivery\",\"pattern\":\"^[0-9a-fA-F]{24}$\",\"example\":\"64b8f0f5e4b0c3a1d5e6f7aa\"}},\"required\":[\"invitation_id\"],\"additionalProperties\":false}]},\"OnboardBuyerResponse\":{\"type\":\"object\",\"description\":\"Response from the buyer onboarding endpoint\",\"properties\":{\"redirect\":{\"type\":\"string\",\"description\":\"The URL path to redirect the user to after successful setup\",\"example\":\"/flows/64b8f0f5e4b0c3a1d5e6f7a8\"}}},\"PingLimit\":{\"x-tags\":[\"Caps and Limits\"],\"title\":\"Ping Limit\",\"description\":\"The ping limit configuration is defined in a flow on a source, or directly on the flow itself. The configuration controls the behavior of the ping limit by setting the maximum and the duration. The counter for a ping limit is kept as a standalone record which shares ping limit's ID.\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"name\":{\"type\":\"string\",\"description\":\"The human-readable name of the ping limit\"},\"maximum\":{\"type\":\"integer\",\"description\":\"The number of pings that will be accepted\"},\"duration\":{\"type\":\"integer\",\"description\":\"The number duration_units the ping limit persists for\"},\"duration_units\":{\"type\":\"string\",\"description\":\"The unit of time the ping limit persists for: minute, hour, day, week, or month\"},\"time_zone\":{\"type\":\"string\",\"description\":\"The time zone in which ping limit resets\",\"example\":\"America/New_York\"},\"created_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Read-only time the ping limit was created\",\"readOnly\":true}}},\"PingLimit-counter\":{\"x-tags\":[\"Caps and Limits\"],\"title\":\"Ping Limit Counter\",\"type\":\"object\",\"description\":\"A ping limit counter keeps track of the number of pings counted against the ping limit. The counter has the same ID as\\nthe ping limit configuration saved with the flow. Most of the properties of the ping limit configuration are available\\non the ping limit counter, as a convenience.\\n\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\",\"example\":\"6402715c40926f93753580d9\"},\"name\":{\"type\":\"string\",\"description\":\"The human-readable name of the ping limit\"},\"failed_count\":{\"type\":\"integer\",\"description\":\"The number of leads that failed during the current interval\"},\"flow_id\":{\"$ref\":\"#/components/schemas/FlowID\"},\"source_id\":{\"$ref\":\"#/components/schemas/EntityID\",\"description\":\"The entity of the flow source if the limit is set on a source\"},\"maximum\":{\"type\":\"integer\",\"description\":\"The number of pings that will be accepted\"},\"duration\":{\"type\":\"integer\",\"description\":\"The number duration_units the ping limit persists for\"},\"duration_units\":{\"type\":\"string\",\"description\":\"The unit of time the ping limit persists for: minute, hour, day, week, or month\"},\"time_zone\":{\"type\":\"string\",\"description\":\"The time zone in which ping limit resets\",\"example\":\"America/New_York\"},\"started_at\":{\"description\":\"Read-only time the ping limit interval started\",\"$ref\":\"#/components/schemas/Timestamp\",\"readOnly\":true},\"count\":{\"type\":\"integer\",\"description\":\"The current number of pings counted against this limit in the current interval\"},\"expires_at\":{\"description\":\"Read-only time the ping limit interval ends\",\"$ref\":\"#/components/schemas/Timestamp\",\"readOnly\":true},\"updated_at\":{\"description\":\"Read-only time the ping limit counter was last updated\",\"$ref\":\"#/components/schemas/Timestamp\",\"readOnly\":true}}},\"PingLimits\":{\"title\":\"Ping Limits\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/PingLimit\"}},\"Price\":{\"description\":\"A price determines the `purchase_price` or `sale_price` for a lead. If\\nall rules in the `rule_set` pass, then the appropriate price property\\nwill be set equal to the `amount`. When more than one price is\\nspecified, the last matching price will be used to set the price\\nproperty on the event.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"description\":\"ID of this price (matches the ID of the corresponding price configuration)\\n\",\"$ref\":\"#/components/schemas/Price\"},\"amount\":{\"description\":\"The price of the lead in USD\",\"type\":\"number\",\"exclusiveMinimum\":0},\"rule_set\":{\"description\":\"The rule set which must pass in order for this price to be\\nconsidered\\n\",\"$ref\":\"#/components/schemas/RuleSet\"}},\"required\":[\"amount\"],\"additionalProperties\":false},\"Pricing\":{\"description\":\"Pricing in LeadConduit automates your financial operations by calculating purchase costs (what you pay lead sellers) and sale prices (what you charge buyers) for every lead. It automates pricing based on dynamic criteria you define, typically reflecting what's in your business agreements.\\n\\nPricing configurations are primarily an array of prices that can be set to fixed amounts, calculated based on conditional rules, or provided by your own pricing service for each lead. Pricing can be set at the flow, flow source, and recipient step level. \\n\\nPricing determines the `purchase_price` and `sale_price` properties on events, and consequently the `cost` and `revenue` properties. These properties are available via the statistics API and reporting API. If no pricing is configured, these properties default to `0`. Price is recorded on the lead event, creating a complete audit trail for reconciliation, lead seller payments, and buyer invoicing.\\n\\n## How Pricing Works\\n\\n### Two Types of Pricing\\n\\n**Purchase Pricing**: What you pay lead sellers for leads. Calculated during submission, recorded on source events. Can be fixed per lead seller, dynamic based on lead characteristics, determined by external services, or overridden by sources.\\n\\n**Sale Pricing**: What you charge buyers for leads. Calculated during delivery, recorded on recipient events. Each buyer can have different pricing for the same lead.\\n\\n### Purchase Pricing Evaluation Layers\\n\\nFor purchase pricing, three layers with precedence order (first match wins):\\n\\n1. **Pricing Service**: Contact an external API for real-time/dynamic pricing with fallback\\n2. **Source Pricing Rules**: Source-specific rules that override flow-level pricing  \\n3. **Flow Pricing Rules**: Base pricing rules when no other pricing applies\\n\\n### Pricing Rules\\n\\nPricing rules use LeadConduit's rule engine with **last matching price wins** behavior. This allows general-to-specific pricing where more specific conditions override general ones.\\n\\n**Limits**: Max $1,000,000, default $0.00, negative prices only via return feedback credits.\\n\\n**Example**: For prices $10 (base), $15 (CA), $20 (CA + auto), $25 (premium) - a premium auto lead from CA gets $25.\\n\\n### Pricing Service\\n\\nExternal APIs enable dynamic pricing based on market conditions, buyer demand, lead quality, or custom algorithms. Services return price and reason; fallback price used if service fails.\\n\\n### Override Pricing\\n\\n**Purchase Override**: Sources can specify their own price, bypassing normal purchase pricing calculation. Used for special campaigns, negotiated deals, test leads, or credits.\\n\\n**Sale Override**: Recipients can specify their own price, bypassing normal sale pricing calculation. Used for custom buyer agreements or special pricing arrangements.\\n\\n**Technical Note**: When `override: true`, the `prices` array must be empty, null, or undefined. The price will be set to whatever amount is provided by the source or recipient.\\n\\n## Purchase Pricing\\n\\nCalculated during lead submission before acceptance criteria. Can be fixed per lead seller, geographic-based, quality-based, or dynamic via external services. Recorded on source events for lead seller reconciliation and margin calculation.\\n\\n**Common Patterns**:\\n- Fixed: $25.00 per lead\\n- Geographic: $10 base, $15 for CA/NY/FL, $20 for TX  \\n- Quality: $5 base + premiums for TrustedForm certified leads, leads with extended data\\n- Time-Based - $25 business hours, $30 weekends, $15 late night\\n- Dynamic: External service with fallback pricing\\n\\n## Sale Pricing\\n\\nConfigured on recipient steps, calculated during delivery after lead acceptance. Each buyer can have different pricing for the same lead. Only successful deliveries generate revenue; failed deliveries don't count.\\n\\n**Common Patterns**:\\n- Fixed: $45.00 per delivered lead\\n- Tiered: $30 base, $50 for high loan amounts, $75 for premium credit scores\\n- Multi-buyer: $100 exclusive, $25 shared pools\\n- Revenue aggregation: Multiple successful deliveries sum to total revenue\\n\\n## Reporting and Reconciliation\\n\\n**Key Metrics**: Total spend/revenue by lead seller/buyer, cost/revenue per lead, margin analysis, ROI by lead type.\\n\\n**Monthly Reconciliation**: \\n- Lead seller payments: Sum purchase_price from source events\\n- Buyer invoicing: Sum sale_price from successful recipient events\\n\\n**Revenue from Success**: Only successful deliveries generate revenue; failed deliveries don't count.\\n\\n**Return Feedback Credits**: Handle quality issues through return feedback mechanism with negative pricing entries for reconciliation.\\n\\n**Dispute Resolution**: Every event contains pricing configuration, evaluated data, and rule matches for complete audit trail.\",\"type\":\"object\",\"properties\":{\"override\":{\"description\":\"Allows a source or a recipient to specify the price rather than\\nrelying on `prices`\\n\",\"type\":\"boolean\"},\"prices\":{\"description\":\"The list of prices to evaluate for each lead\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Price\"}}},\"additionalProperties\":false},\"PricingServiceConfiguration\":{\"type\":\"object\",\"title\":\"Pricing Service Config\",\"description\":\"The configuration required on a Source or Flow to define a Pricing Service for lead pricing.\\n\",\"properties\":{\"service_id\":{\"$ref\":\"#/components/schemas/PricingServiceID\"},\"fallback_price\":{\"type\":\"number\"}},\"required\":[\"service_id\",\"fallback_price\"],\"additionalProperties\":false},\"PricingService\":{\"title\":\"Pricing Service\",\"description\":\"An external service which returns a price for a lead.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/PricingServiceID\"},\"name\":{\"type\":\"string\"},\"integration\":{\"$ref\":\"#/components/schemas/Integration\"},\"created_at\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"updated_at\":{\"$ref\":\"#/components/schemas/Timestamp\"}},\"required\":[\"id\",\"name\"],\"additionalProperties\":false},\"PricingServiceID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique identifier for a configured pricing service\"}]},\"Product\":{\"type\":\"object\",\"description\":\"A product to which an account can subscribe\",\"properties\":{\"id\":{\"type\":\"string\",\"enum\":[\"lcx\",\"trustedform\",\"suppressionlist\",\"account\"],\"x-enumDescriptions\":{\"lcx\":\"LeadConduit\",\"trustedform\":\"TrustedForm\",\"suppressionlist\":\"SuppressionList\"}},\"name\":{\"type\":\"string\"},\"base_url\":{\"type\":\"string\",\"description\":\"URL to the product application\"},\"marketing_url\":{\"type\":\"string\",\"description\":\"URL to the product marketing site\"},\"subscribed\":{\"type\":\"boolean\",\"description\":\"Is the account subscribed to this product?\"}},\"required\":[\"id\",\"name\"]},\"recipient-event\":{\"allOf\":[{\"$ref\":\"#/components/schemas/EventProperties\"},{\"title\":\"Recipient Event\",\"type\":\"object\",\"description\":\"When a lead is processed by a recipient step, the associated integration is resolved using\\nthe `module_id` and invoked. The integration contacts the recipient's server and determines the `outcome` and `reason` \\nfor the call. Different integrations determine outcome in different ways, so it's important to know what `success`\\nor `failure` mean for a particular integration.\\n\",\"properties\":{\"type\":{\"description\":\"Recorded after a lead is sent to a recipient using a recipient step in a flow\",\"type\":\"string\",\"enum\":[\"recipient\"]},\"outcome\":{\"enum\":[\"success\",\"failure\",\"error\",\"skip\"],\"x-enumDescriptions\":{\"success\":\"The recipient accepted the lead\",\"failure\":\"The recipient rejected the lead\",\"error\":\"An error occurred while attempting to communicate with the recipient\",\"skip\":\"The recipient step was skipped due to failure the rule set or cap having been met\"}},\"vars\":{\"$ref\":\"#/components/schemas/RecipientEventVariables\"},\"step_id\":{\"type\":\"string\",\"description\":\"The id of the step in the flow associated with this event\"},\"caps\":{\"$ref\":\"#/components/schemas/Caps\"},\"caps_reached\":{\"type\":\"boolean\",\"description\":\"One or more of the recipient caps were met\"},\"key\":{\"type\":\"string\",\"description\":\"The property name on the event where appended data is stored\"},\"cost\":{\"type\":\"number\",\"format\":\"double\",\"description\":\"The amount paid for the purchase of this lead\"},\"purchase_price\":{\"type\":\"number\",\"format\":\"double\",\"description\":\"The amount paid for the purchase of this lead\"},\"sale_price\":{\"type\":\"number\",\"format\":\"double\",\"description\":\"The revenue received for the sale of this lead\"},\"revenue\":{\"type\":\"number\",\"format\":\"double\",\"description\":\"The difference between the purchase price and the sale price\"},\"module_id\":{\"$ref\":\"#/components/schemas/ModuleID\"},\"credential\":{\"$ref\":\"#/components/schemas/Credential\"},\"credential_updated\":{\"type\":\"boolean\",\"description\":\"Whether the credential used by the integration was refreshed\"},\"package_version\":{\"$ref\":\"#/components/schemas/SemanticVersion\"},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\",\"description\":\"The rule set configured on the recipient step when the lead was processed \"},\"mappings\":{\"type\":\"array\",\"description\":\"The mappings applied while invoking the integration\",\"items\":{\"$ref\":\"#/components/schemas/Mapping\"}},\"pricing\":{\"$ref\":\"#/components/schemas/Pricing\",\"description\":\"The pricing configuration applied to this recipient\"},\"transactions\":{\"$ref\":\"#/components/schemas/Transactions\"},\"wait_ms\":{\"type\":\"integer\",\"description\":\"The number of milliseconds that LeadConduit spent waiting the recipient to respond\"},\"total_ms\":{\"type\":\"integer\",\"description\":\"The number of milliseconds that elapsed since the lead was submitted \"}}}]},\"RecipientEventVariables\":{\"title\":\"Recipient Event Variables\",\"description\":\"All data available at the time LeadConduit starts processing the recipient step. The following\\nadditional data will be added to the vars for the purposes of processing this step.\\n* `price` — The price to be paid to the recipient\\n* `purchase_price` - The cost of the lead paid to the source\\n* `event_id` - The identifier of this event (so it can be sent to the recipient for feedback)\\n* `recipient` — The `id` and `name` of the recipient\\n\",\"type\":\"object\",\"properties\":{\"price\":{\"type\":\"number\",\"description\":\"The price to be paid to the recipient\"},\"purchase_price\":{\"type\":\"number\",\"description\":\"The cost of the lead paid to the source\"},\"event_id\":{\"$ref\":\"#/components/schemas/EventID\",\"example\":\"636999a5a28de89048cd16fc\"}},\"patternProperties\":{\"^recipient\\\\.\":{\"$ref\":\"#/components/schemas/VariableRecipientMetadata\"},\"^submission\\\\.\":{\"$ref\":\"#/components/schemas/VariableSubmissionMetadata\"},\"^account\\\\.\":{\"$ref\":\"#/components/schemas/VariableAccountMetadata\"},\"^flow\\\\.\":{\"$ref\":\"#/components/schemas/VariableFlowMetadata\"},\"^source\\\\.\":{\"$ref\":\"#/components/schemas/VariableSourceMetadata\"},\"^lead\\\\.\":{\"$ref\":\"#/components/schemas/VariableLeadData\"},\"^.+\\\\.\":{\"$ref\":\"#/components/schemas/VariableAppendedData\"}},\"additionalProperties\":false},\"RecipientStep\":{\"title\":\"Recipient Step\",\"type\":\"object\",\"description\":\"A recipient step is used to send leads out of LeadConduit. It is used to connect with add-on services or to \\ninvoke any outbound integration.\\n\",\"properties\":{\"type\":{\"type\":\"string\",\"enum\":[\"recipient\"]},\"id\":{\"$ref\":\"#/components/schemas/ShortID\"},\"description\":{\"type\":\"string\",\"maxLength\":120},\"notes\":{\"type\":\"string\",\"maxLength\":2000},\"entity\":{\"$ref\":\"#/components/schemas/EntitySummary\"},\"integration\":{\"$ref\":\"#/components/schemas/Integration\"},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\"},\"feedback\":{\"$ref\":\"#/components/schemas/Feedback\"},\"caps\":{\"$ref\":\"#/components/schemas/Caps\"},\"pricing\":{\"$ref\":\"#/components/schemas/Pricing\"},\"enabled\":{\"type\":\"boolean\",\"default\":true},\"retry_enabled\":{\"type\":\"boolean\"}},\"additionalProperties\":false,\"required\":[\"type\",\"entity\",\"integration\"]},\"Report\":{\"x-tags\":[\"Reports\"],\"description\":\"A report is a named definition of criteria (columns, rules, group_bys)\\nwhich is stored. A stored report can be run for a given timeframe,\\nproducing the report results. The results are a count of the events for\\neach column in that timeframe that match the rules and which are\\noptionally grouped by event properties.\\n\\nReports can be shared outside LeadConduit such that anyone who has the\\nURL to the shared report can view it without authentication. Each\\nshared report URL contains a generated, unique, unguessable token,\\nwhich is stored as a property in the report definition. To create the\\ntoken for a report, use the `share` endpoint. To stop sharing a report,\\nuse the `unshare` endpoint, which will clear the token.'\\n\",\"type\":\"object\",\"properties\":{\"name\":{\"description\":\"required name of the report\",\"type\":\"string\"},\"description\":{\"description\":\"optional extra description\",\"type\":\"string\"},\"columns\":{\"description\":\"Array of report columns\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/report-column\"}},\"rules\":{\"description\":\"rules to match events to include\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ReportRule\"}},\"group_by\":{\"description\":\"group results by these event properties\",\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"token\":{\"description\":\"identifier used for sharing\",\"type\":\"string\"},\"created_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Time report was created\",\"readOnly\":true},\"updated_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Time report was last updated\",\"readOnly\":true}}},\"report-column\":{\"$ref\":\"#/components/schemas/event-statistic\",\"title\":\"Report Column\"},\"ReportMeta\":{\"description\":\"Metadata on the report that was shared\",\"type\":\"object\",\"properties\":{\"token\":{\"description\":\"identifier used for sharing\",\"type\":\"string\"},\"account_name\":{\"description\":\"The name of the account holder\",\"type\":\"string\"},\"vars\":{\"description\":\"Array of variables associated to the report\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ReportVariables\"}},\"flows\":{\"description\":\"IDs and names of flows associated to report\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"name\":{\"type\":\"string\"}}}},\"entities\":{\"description\":\"IDs and names of entities associated to report\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"name\":{\"type\":\"string\"}}}}}},\"ReportRule\":{\"description\":\"An array of rules can be provided to filter events that are included in\\nthe report. If an event matches the filter, it's included in the\\nresults, otherwise it's not.  Each rule has a `lhv`, an `op`, and a\\n`rhv`.\\n\\nNot all filter operators make sense for different property data types,\\nso only certain operators are valid for each.\\n\\nNote: For `contains` and `includes` and `does not include` operators,\\nthe property must exist in order for the event to pass the filter. If\\nthe property does not exist, then the event will not pass the rule and\\nwill not be returned as part of the results.\\n\\n- `is equal to` Equal to – Note that if your property’s value is an\\narray, `is equal to` can be used to filter for values inside that array.\\nFor example, eq: 5 will match a value of [5, 6, 7]. (String, Number,\\nBoolean)\\n- `is not equal to` Not equal to (String, Number, Boolean)\\n- `is less than` Less than (Number)\\n- `is less than or equal` Less than or equal to (Number)\\n- `is greater than` Greater than (Number)\\n- `is greater than or equal` Greater than or equal to (Number)\\n- `is blank` Whether a specific property does not exist on an event\\n  record. The `rhv` cannot be provided. (String, Number, Boolean)\\n- `is not blank` Whether a specific property exists on an event record. The `rhv` cannot be provided. (String, Number, Boolean)\\n- `is true` Does the `lhv` evaluate to `true`? The `rhv` cannot be provided. (Boolean)\\n- `is false` Does the `lhv` evaluate to `false`? The `rhv` cannot be provided. (Boolean)\\n- `is included in` Whether or not the property value is in a given set\\n  of values. The value passed in must be an array of values. Example:\\n  [1,2,4,5]. (String, Number, Boolean)\\n- `includes` Whether or not the string property value contains the\\n  given sequence of characters. (Array, String)\\n- `does not include` Whether or not the string property value does not\\n  contain the given sequence of characters. (Array, String)\\n\",\"type\":\"object\",\"properties\":{\"lhv\":{\"type\":\"string\",\"description\":\"The name of the property to filter (e.g. vars.lead.email.domain)\"},\"op\":{\"description\":\"The operator to use on the property name (see below table)\",\"type\":\"string\",\"enum\":[\"is equal to\",\"is not equal to\",\"is less than\",\"is less than or equal\",\"is greater than\",\"is greater than or equal\",\"is blank\",\"is not blank\",\"is true\",\"is false\",\"is included in\",\"includes\",\"does not include\"]},\"rhv\":{\"description\":\"The value to compare to the `lhv`\",\"type\":\"string\"}}},\"ReportVariables\":{\"title\":\"Report Variables\",\"type\":\"object\",\"description\":\"All data available at the time LeadConduit started processing this event\\n\",\"patternProperties\":{\"^submission\\\\.\":{\"$ref\":\"#/components/schemas/VariableSubmissionMetadata\"},\"^feedback\\\\.\":{\"$ref\":\"#/components/schemas/VariableFeedbackMetadata\"},\"^account\\\\.\":{\"$ref\":\"#/components/schemas/VariableAccountMetadata\"},\"^flow\\\\.\":{\"$ref\":\"#/components/schemas/VariableFlowMetadata\"},\"^source\\\\.\":{\"$ref\":\"#/components/schemas/VariableSourceMetadata\"},\"^lead\\\\.\":{\"$ref\":\"#/components/schemas/VariableLeadData\"}},\"additionalProperties\":true},\"retry-event\":{\"allOf\":[{\"$ref\":\"#/components/schemas/EventProperties\"},{\"title\":\"Retry Event\",\"type\":\"object\",\"description\":\"When a recipient step results in an error outcome and retry is enabled, a retry event is recorded\\n\",\"properties\":{\"type\":{\"description\":\"Recorded after an error recipient event is retried\",\"type\":\"string\",\"enum\":[\"retry\"]},\"outcome\":{\"enum\":[\"success\",\"failure\",\"error\",\"skip\"],\"x-enumDescriptions\":{\"success\":\"The recipient accepted the lead\",\"failure\":\"The recipient rejected the lead\",\"error\":\"An error occurred while attempting to communicate with the recipient\",\"skip\":\"The recipient step was skipped due to failure the rule set or cap having been met\"}},\"retry_status\":{\"type\":\"string\",\"enum\":[\"started\",\"completed\"]},\"vars\":{\"$ref\":\"#/components/schemas/RecipientEventVariables\"},\"step_id\":{\"type\":\"string\",\"description\":\"The id of the step in the flow associated with this event\"},\"caps_reached\":{\"type\":\"boolean\",\"description\":\"One or more of the recipient caps were met\"},\"key\":{\"type\":\"string\",\"description\":\"The property name on the event where appended data is stored\"},\"cost\":{\"type\":\"number\",\"format\":\"double\",\"description\":\"The amount paid for the purchase of this lead\"},\"purchase_price\":{\"type\":\"number\",\"format\":\"double\",\"description\":\"The amount paid for the purchase of this lead\"},\"sale_price\":{\"type\":\"number\",\"format\":\"double\",\"description\":\"The revenue received for the sale of this lead\"},\"revenue\":{\"type\":\"number\",\"format\":\"double\",\"description\":\"The difference between the purchase price and the sale price\"},\"module_id\":{\"$ref\":\"#/components/schemas/ModuleID\"},\"credential\":{\"$ref\":\"#/components/schemas/Credential\"},\"credential_updated\":{\"type\":\"boolean\",\"description\":\"Whether the credential used by the integration was refreshed\"},\"package_version\":{\"$ref\":\"#/components/schemas/SemanticVersion\"},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\",\"description\":\"The rule set configured on the recipient step when the lead was processed \"},\"mappings\":{\"type\":\"array\",\"description\":\"The mappings applied while invoking the integration\",\"items\":{\"$ref\":\"#/components/schemas/Mapping\"}},\"pricing\":{\"$ref\":\"#/components/schemas/Pricing\",\"description\":\"The pricing configuration applied to this recipient\"},\"transactions\":{\"$ref\":\"#/components/schemas/Transactions\"},\"wait_ms\":{\"type\":\"integer\",\"description\":\"The number of milliseconds that LeadConduit spent waiting the recipient to respond\"},\"total_ms\":{\"type\":\"integer\",\"description\":\"The number of milliseconds that elapsed since the lead was submitted \"}}}]},\"Route\":{\"description\":\"A route is defined by a Rule Set and its corresponding Flow and Source.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"description\":\"Short ID of this route\",\"$ref\":\"#/components/schemas/ShortID\"},\"flow_id\":{\"description\":\"The ID of the Flow this route directs leads to\",\"$ref\":\"#/components/schemas/FlowID\"},\"source_id\":{\"description\":\"The ID of the Source this route directs leads to\",\"$ref\":\"#/components/schemas/EntityID\"},\"rule_set\":{\"description\":\"The associated Flow & Source are used when these rules match the\\nlead\\n\",\"$ref\":\"#/components/schemas/RuleSet\"}}},\"Router\":{\"x-tags\":[\"Routers\"],\"description\":\"A router is a single lead-submission endpoint that's able to distribute\\nlead submissions to any one of an account's various [Flows](https://developers.activeprospect.com/docs/leadconduit/api/tag/Flows/),\\nbased on evaluation of [rules](https://developers.activeprospect.com/docs/leadconduit/api/tag/Rules/#tag/Rules/schema/RuleSet).\\n\\nThe first rules that match are used to select the Flow and Source;\\nsubsequent rules are ignored.\\n\\nOnly one Router for a given integration module-id\\nshould exist in an account.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\",\"description\":\"ID of this router\"},\"module_id\":{\"$ref\":\"#/components/schemas/ModuleID\"},\"routes\":{\"description\":\"The routes to be evaluated by this router\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Route\"}},\"created_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"readOnly\":true},\"updated_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"readOnly\":true}}},\"Rule\":{\"x-tags\":[\"Rules\"],\"oneOf\":[{\"$ref\":\"#/components/schemas/binary-rule\"},{\"$ref\":\"#/components/schemas/unary-rule\"}]},\"RuleSet\":{\"x-tags\":[\"Rules\"],\"title\":\"Rule Set\",\"type\":\"object\",\"description\":\"A rule set is a collection of rules to evaluate. The `op` property determines whether all rules must pass (`and`) or just one of them must pass (`or`) in order for the rule set to be considered passing.\\n\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ShortID\",\"description\":\"The ID of the rule set in this flow\",\"example\":\"0d144a\",\"readOnly\":true},\"op\":{\"type\":\"string\",\"description\":\"Determines whether all rules or just some rules must pass for the overall set to pass\",\"enum\":[\"and\",\"or\"],\"x-enumDescriptions\":{\"and\":\"All rules in the set must pass\",\"or\":\"Only one rule in the set must pass\"}},\"rules\":{\"type\":\"array\",\"description\":\"The required rules to be evaluated. Rule sets may also be specified as array elements in order to achieve nesting.\",\"minItems\":1,\"items\":{\"oneOf\":[{\"$ref\":\"#/components/schemas/Rule\"},{\"$ref\":\"#/components/schemas/RuleSet\"}]}}},\"additionalProperties\":false,\"required\":[\"op\",\"rules\"]},\"SemanticVersion\":{\"type\":\"string\",\"description\":\"A <a href=\\\"http://semver.org\\\" target=\\\"_blank\\\">semantic version</a>\"},\"ShortID\":{\"type\":\"string\",\"pattern\":\"^[0-9a-zA-Z]{6}$\",\"example\":\"1aacd0\",\"readOnly\":true},\"Source\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ShortID\"},\"integration\":{\"$ref\":\"#/components/schemas/Integration\"},\"entity\":{\"$ref\":\"#/components/schemas/EntitySummary\"},\"acceptance_criteria\":{\"$ref\":\"#/components/schemas/acceptance-criteria\"},\"feedback\":{\"$ref\":\"#/components/schemas/Feedback\"},\"caps\":{\"$ref\":\"#/components/schemas/Caps\"},\"ping_limits\":{\"$ref\":\"#/components/schemas/PingLimits\"},\"credential_id\":{\"$ref\":\"#/components/schemas/CredentialID\"},\"pricing\":{\"$ref\":\"#/components/schemas/Pricing\"},\"pricing_service\":{\"$ref\":\"#/components/schemas/PricingServiceConfiguration\"},\"enabled\":{\"type\":\"boolean\"},\"authentication_required\":{\"type\":\"boolean\"}},\"additionalProperties\":true,\"required\":[\"integration\",\"entity\"]},\"source-event\":{\"allOf\":[{\"$ref\":\"#/components/schemas/EventProperties\"},{\"title\":\"Source Event\",\"type\":\"object\",\"description\":\"The source event is created after all steps have been processed. It represents the outcome of lead processing from the perspective of the lead source. A source event records the below properties in addition to the event properties shown above.\",\"properties\":{\"type\":{\"description\":\"Recorded after a source submits a lead to a flow\",\"type\":\"string\",\"enum\":[\"source\"]},\"outcome\":{\"enum\":[\"success\",\"failure\",\"error\"],\"x-enumDescriptions\":{\"success\":\"The source was notified in the response that the lead was accepted\",\"failure\":\"The source was notified in the response that the lead was rejected\",\"error\":\"The source was notified in the response that an error occurred while processing the lead\"}},\"vars\":{\"$ref\":\"#/components/schemas/SourceEventVariables\"},\"module_id\":{\"$ref\":\"#/components/schemas/ModuleID\",\"description\":\"The integration module ID configured for the source\"},\"package_version\":{\"$ref\":\"#/components/schemas/SemanticVersion\",\"description\":\"The semantic version of the integration package\"},\"acceptance_criteria\":{\"$ref\":\"#/components/schemas/acceptance-criteria\",\"description\":\"The acceptance criteria configured on the source when the lead was processed\"},\"step_count\":{\"type\":\"integer\",\"description\":\"The number of steps processed for this lead (>= 0 and <= total number of steps)\",\"example\":4},\"appended\":{\"type\":\"object\",\"description\":\"All data appended while handing the lead\"},\"request\":{\"$ref\":\"#/components/schemas/HttpRequest\",\"description\":\"The inbound HTTP request\"},\"response\":{\"$ref\":\"#/components/schemas/HttpResponse\",\"description\":\"The inbound HTTP response\"}}}]},\"SourceEventVariables\":{\"title\":\"Source Event Variables\",\"description\":\"All data available at the time LeadConduit started processing this event\\n\",\"type\":\"object\",\"patternProperties\":{\"^submission\\\\.\":{\"$ref\":\"#/components/schemas/VariableSubmissionMetadata\"},\"^account\\\\.\":{\"$ref\":\"#/components/schemas/VariableAccountMetadata\"},\"^flow\\\\.\":{\"$ref\":\"#/components/schemas/VariableFlowMetadata\"},\"^source\\\\.\":{\"$ref\":\"#/components/schemas/VariableSourceMetadata\"},\"^lead\\\\.\":{\"$ref\":\"#/components/schemas/VariableLeadData\"}},\"additionalProperties\":false},\"Sources\":{\"oneOf\":[{\"type\":\"null\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Source\"}}]},\"SsoID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The account's ID global across all ActiveProspect products\",\"example\":\"5fd4371e940df5a34a3888b2\"}]},\"Status\":{\"x-tags\":[\"System\"],\"type\":\"object\",\"properties\":{\"version\":{\"description\":\"Which version is running\",\"type\":\"string\",\"pattern\":\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\",\"example\":\"13.5.0\"}}},\"Step\":{\"title\":\"Step\",\"type\":\"object\",\"description\":\"After executing acceptance criteria, caps, and pricing for the source and flow, steps are\\nprocessed in order sequentially. Each step represents an operation to perform on the lead\\nas it moves through the flow pipeline.\\n\",\"discriminator\":{\"propertyName\":\"type\",\"mapping\":{\"filter\":\"#/components/schemas/FilterStep\",\"recipient\":\"#/components/schemas/RecipientStep\",\"distribution\":\"#/components/schemas/DistributionStep\"}},\"oneOf\":[{\"$ref\":\"#/components/schemas/FilterStep\"},{\"$ref\":\"#/components/schemas/RecipientStep\"},{\"$ref\":\"#/components/schemas/DistributionStep\"}]},\"SubmissionDocAccessLogs\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/SubmissionDocAccessLog\"}},\"SubmissionDocAccessLog\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"accessor\":{\"type\":\"object\",\"properties\":{\"account\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/AccountID\"},\"name\":{\"type\":\"string\",\"readOnly\":true}}},\"user\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/UserID\"},\"name\":{\"type\":\"string\",\"readOnly\":true},\"email\":{\"type\":\"string\",\"readOnly\":true}}}}},\"submission_doc\":{\"type\":\"object\",\"properties\":{\"flow\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/FlowID\"},\"name\":{\"type\":\"string\",\"readOnly\":true},\"account\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/AccountID\"},\"name\":{\"type\":\"string\",\"readOnly\":true}}}}},\"source\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/EntityID\"},\"name\":{\"type\":\"string\",\"readOnly\":true}}}}},\"created_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Read-only time the access log was created\",\"readOnly\":true},\"last_accessed_at\":{\"$ref\":\"#/components/schemas/Timestamp\",\"description\":\"Read-only time the access log was accessed most recently\",\"readOnly\":true},\"access_count\":{\"description\":\"The number of times the submission document has been accessed from creation to the most recent access.\",\"type\":\"integer\",\"readOnly\":true}}},\"Template\":{\"type\":\"string\",\"title\":\"Template\",\"description\":\"# LeadConduit Templates\\n\\n## Overview\\n\\nTemplates are the dynamic value engine of LeadConduit. They transform static configurations into intelligent, adaptive systems by resolving variables, computing values, and manipulating data at runtime. Think of templates as smart placeholders that know how to fetch and transform data when needed.\\n\\nTemplates answer a fundamental question:\\n**How do I get the right value at the right time?**\\n\\nTemplates work seamlessly with rules and mappings:\\n- **Rules** use templates for dynamic comparisons\\n- **Mappings** use templates to compute values\\n- **Templates** provide the bridge between configuration and runtime data\\n\\n## Why Templates Exist\\n\\n### The Static Configuration Problem\\nWithout templates, every value would be hard-coded:\\n- Phone format: \\\"(512) 789-1111\\\" for everyone\\n- Greeting: \\\"Hello Customer\\\" instead of personalized\\n- Dates: Fixed instead of calculated\\n- Prices: Static instead of computed\\n\\nTemplates make configurations come alive with actual data.\\n\\n### The Data Access Problem\\nLead data has complex structures:\\n- Nested objects: `address_1`, `city`\\n- Array elements: `tags[0]`\\n- Type components: `phone.area`\\n- Calculated values: `price * tax_rate`\\n\\nTemplates provide a consistent way to access any data, anywhere.\\n\\n### The Transformation Problem\\nRaw data rarely matches what you need:\\n- Dates need formatting\\n- Names need case changes\\n- Numbers need calculations\\n- Strings need manipulation\\n\\nTemplates include helpers that transform data on the fly.\\n\\n### Technical Details\\n\\nLeadConduit supports combining, [formatting](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/#tag/Templates/section/Variable-Formatting),\\n[hashing](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/#tag/Templates/section/Variable-Hashing), and [performing math](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/#tag/Templates/section/Variable-Math) on\\nvalues using template markup. Templating in LeadConduit is based on the\\npopular [Handlebars](https://handlebarsjs.com/) semantic templating\\nlibrary. A template is a string which contains any number of variable\\nplaceholders\\n\\n## Template Variable\\n\\nVariable placeholders in templates start and end with two curly-brace\\ncharacters: `{{ lead.first_name }}`. Multiple placeholders can be\\ncombined in a single template: `{{ lead.first_name }} {{ lead.last_name\\n}}`. The [universe of possible variables](https://developers.activeprospect.com/docs/leadconduit/api/tag/Variables/) available to a\\ntemplate depends on the [fields](https://developers.activeprospect.com/docs/leadconduit/api/tag/Fields/) defined in your flow and the\\nsteps you've added to your flow.\\n\\n## Variable Formatting\\n\\nLeadConduit has a built-in helper for formatting numbers and dates.\\nFormatting a value is done with the `format` helper.  If the value is a\\ndate field, then you may use date formatting options with the helper.\\nIf it's a number field, then you may use the number formatting options\\nwith the helper.\\n\\n### Date Variable Formatting\\n\\nTo format a date, use the `format` helper: `{{ format lead.dob\\nformat=\\\"YYYY-MM-DD\\\" }}` results in '2015-06-24'. The `format` option is\\na string which defines the format of the date. This format can be any\\ncombination of the below tokens.  To escape characters in format\\nstrings, you can wrap the characters in square brackets: `{{ format\\nlead.dob format=\\\"[It's] MMMM Do\\\" }}` results in \\\"It's October 12th\\\".\\n\\n#### Date Format Tokens\\n\\n|                            | Token                      | Output     |\\n| -------------------------- | -------------------------- | -----------|\\n| Month                      | `M`                          | 1 2 ... 11 12\\n|                            | `Mo`                         | 1st 2nd ... 11th 12th\\n|                            | `MM`                         | 01 02 ... 11 12\\n|                            | `MMM`                        | Jan Feb ... Nov Dec\\n|                            | `MMMM`                       | January February ... November December\\n| Quarter                    | `Q`                          | 1 2 3 4\\n|                            | `Qo`                         | 1st 2nd 3rd 4th\\n| Day of Month               | `D`                          | 1 2 ... 30 31\\n|                            | `Do`                         | 1st 2nd ... 30th 31st\\n|                            | `DD`                         | 01 02 ... 30 31\\n| Day of Year                | `DDD`                        | 1 2 ... 364 365\\n|                            | `DDDo`                       | 1st 2nd ... 364th 365th\\n|                            | `DDDD`                       | 001 002 ... 364 365\\n| Day of Week                | `d`                          | 0 1 ... 5 6\\n|                            | `do`                         | 0th 1st ... 5th 6th\\n|                            | `dd`                         | Su Mo ... Fr Sa\\n|                            | `ddd`                        | Sun Mon ... Fri Sat\\n|                            | `dddd`                       | Sunday Monday ... Friday Saturday\\n| Day of Week (Locale)       | `e`                          | 0 1 ... 5 6\\n| Day of Week (ISO)          | `E`                          | 1 2 ... 6 7\\n| Week of Year               | `w`                          | 1 2 ... 52 53\\n|                            | `wo`                         | 1st 2nd ... 52nd 53rd\\n|                            | `ww`                         | 01 02 ... 52 53\\n| Week of Year (ISO)         | `W`                          | 1 2 ... 52 53\\n|                            | `Wo`                         | 1st 2nd ... 52nd 53rd\\n|                            | `WW`                         | 01 02 ... 52 53\\n| Year                       | `YY`                         | 70 71 ... 29 30\\n|                            | `YYYY`                       | 1970 1971 ... 2029 2030\\n|                            | `Y`                         | 1970 1971 ... 9999 +10000 +10001 Note: This complies with the ISO 8601 standard for dates past the year 9999\\n| Week Year                  | `gg`                         | 70 71 ... 29 30\\n|                            | `gggg`                       | 1970 1971 ... 2029 2030\\n| Week Year (ISO)            | `GG`                         | 70 71 ... 29 30\\n|                            | `GGGG`                       | 1970 1971 ... 2029 2030\\n| AM/PM                      | `A`                          | AM PM\\n|                            | `a`                          | am pm\\n| Hour                       | `H`                          | 0 1 ... 22 23\\n|                            | `HH`                         | 00 01 ... 22 23\\n|                            | `h`                          | 1 2 ... 11 12\\n|                            | `hh`                         | 01 02 ... 11 12\\n|                            | `k`                          | 1 2 ... 23 24\\n|                            | `kk`                         | 01 02 ... 23 24\\n| Minute                     | `m`                          | 0 1 ... 58 59\\n|                            | `mm`                         | 00 01 ... 58 59\\n| Second                     | `s`                          | 0 1 ... 58 59\\n|                            | `ss`                         | 00 01 ... 58 59\\n| Fractional Second          | `S`                          | 0 1 ... 8 9\\n|                            | `SS`                         | 00 01 ... 98 99\\n|                            | `SSS`                        | 000 001 ... 998 999\\n|                            | `SSSS ... SSSSSSSSS`         | 000[0..] 001[0..] ... 998[0..] 999[0..]\\n| Time Zone                  | `z` or `zz`                  | EST CST ... MST PST (requires use of the `timezone` option)\\n|                            | `Z`                          | -07:00 -06:00 ... +06:00 +07:00\\n|                            | `ZZ`                         | -0700 -0600 ... +0600 +0700\\n| Unix Timestamp             | `X`                          | 1360013296\\n| Unix Millisecond Timestamp | `x`                          | 1360013296123\\n\\n#### Localized Date Formats\\n\\nBecause preferred formatting differs based on locale, there are a few\\ntokens that can be used to format a moment based on its locale.  There\\nare upper and lower case variations on the same formats. The lowercase\\nversion is intended to be the shortened version of its uppercase\\ncounterpart.  To change the locale, use the `locale` options: `{{\\nformat date format=\\\"LLL\\\" locale=\\\"fr\\\" }}` results in \\\"24 june 2015 17:24\\\".\\n\\n|                                      | Format string | Output          |\\n| ------------------------------------ | ------------- | ----------------|\\n| Time                                 | `LT`            | 8:30 PM\\n| Time with seconds                    | `LTS`           | 8:30:25 PM\\n| Month numeral, day of month, year    | `L`             | 09/04/1986\\n|                                      | `l`             | 9/4/1986\\n| Month name, day of month, year       | `LL`            | September 4, 1986\\n|                                      | `ll`            | Sep 4, 1986\\n| Month name, day of month, year, time | `LLL`           | September 4, 1986 8:30 PM\\n|                                      | `lll`           | Sep 4, 1986 8:30 PM\\n| Month name, day of month, day of week, year, time | `LLLL` | Thursday, September 4, 1986 8:30 PM\\n|                                      | `llll`          | Thu, Sep 4, 1986 8:30 PM\\n\\n### Number Variable Formatting\\n\\nTo format a number, use the `format` helper: `{{ format\\nlead.mortgage.first_mortgage_balance format=\\\"$0,0.00\\\"}}` results in\\n'$45,302.00'. The `format` option is a string which defines the format\\nof the number. See the table of examples below:\\n\\n| Number     | Format       | String      |\\n| ---------- | ------------ | ----------- |\\n| 10000      | `0,0.0000`   | 10,000.0000\\n| 10000.23   | `0,0`        | 10,000\\n| 10000.23   | `+0,0`       | +10,000\\n| -10000     | `0,0.0`      | -10,000.0\\n| 10000.1234 | `0.000`      | 10000.123\\n| 100.1234   | `00000`      | 00100\\n| 1000.1234  | `000000,0`   | 001,000\\n| 10         | `000.00`     | 010.00\\n| 10000.1234 | `0[.]00000`  | 10000.12340\\n| -10000     | `(0,0.0000)` | (10,000.0000)\\n| -0.23      | `.00`        | -.23\\n| -0.23      | `(.00)`      | (.23)\\n| 0.23       | `0.00000`    | 0.23000\\n| 0.23       | `0.0[0000]`  | 0.23\\n| 1230974    | `0.0a`       | 1.2m\\n| 1460       | `0 a`        | 1 k\\n| -104000    | `0a`         | -104k\\n| 1          | `0o`         | 1st\\n| 100        | `0o`         | 100th\\n| 1000.234   | `$0,0.00`    | $1,000.23\\n| 1000.2     | `0,0[.]00 $` | 1,000.20 $\\n| 1001       | `$ 0,0[.]00` | $ 1,001\\n| -1000.234  | `($0,0)`     | ($1,000)\\n| -1000.234  | `$0.00`      | -$1000.23\\n| 1230974    | `($ 0.00 a)` | $ 1.23 m\\n\\nUse the `locale` option to format the number to a particular locale:\\n`{{ format lead.mortgage.first_mortgage_balance locale=\\\"fr\\\"\\nformat=\\\"$0,0.00\\\" }}` results in '€45 302.00'.\\n\\n### Converting Number and Boolean to String\\n\\nFields of type number and boolean can be converted to string using the `format` helper with the `dataType=\\\"String\\\"` option:\\n\\n`{{format field_name dataType=\\\"String\\\"}}`\\n\\nExample:\\n- Input: `{{format lead.age dataType=\\\"String\\\"}}` with `lead.age` = 30\\n- Output: \\\"30\\\"\\n\\n### Converting String to Number\\n\\nFields whose final result from the `format` helper is a string can be converted to a number if the `dataType=\\\"Number\\\"` option is passed and the value is a string representing a valid number.\\n\\nExamples:\\n- Input: `{{format lead.postal_code dataType=\\\"Number\\\"}}` with `lead.postal_code` = '78751'\\n- Output: 78751 (as a number value)\\n\\nIf the string does not represent a valid number, the result will not be converted:\\n- Input: `{{format lead.postal_code dataType=\\\"Number\\\"}}` with `lead.postal_code` = 'H3Z 2Y7'\\n- Output: 'H3Z 2Y7'\\n\\nThis can also be used with dates if the formatting returns only numbers, such as epoch time:\\n- Input: `{{format lead.source_timestamp format=\\\"X\\\" dataType=\\\"Number\\\"}}` with `lead.source_timestamp` = '2015-06-24T17:24:49.060Z'\\n- Output: 1435166689 (as a number value)\\n\\n\\n## Variable String Manipulation\\n\\nStrings can be manipulated with the following helpers:\\n\\n### Lowercase\\n\\nTransforms the value to lowercase:\\n\\n`{{lowercase field_name}}`\\n\\nExample:\\n- Input: `{{lowercase lead.first_name}}` with `lead.first_name` = \\\"Mike\\\"\\n- Output: \\\"mike\\\"\\n\\n### Uppercase\\n\\nTransforms the value to uppercase:\\n\\n`{{uppercase field_name}}`\\n\\nExample:\\n- Input: `{{uppercase lead.first_name}}` with `lead.first_name` = \\\"Mike\\\"\\n- Output: \\\"MIKE\\\"\\n\\n### Substring\\n\\nReturns a substring from the start position to the end position, or from the start position to the end of the string if no end position is provided:\\n\\n`{{substring field_name start=\\\"3\\\"}}`\\n\\nExample:\\n- Input: `{{substring lead.first_name start=\\\"3\\\"}}` with `lead.first_name` = \\\"Michael\\\"\\n- Output: \\\"chael\\\"\\n\\n`{{substring field_name start=\\\"2\\\" end=\\\"4\\\"}}`\\n\\nExample:\\n- Input: `{{substring lead.first_name start=\\\"2\\\" end=\\\"4\\\"}}` with `lead.first_name` = \\\"Michael\\\"\\n- Output: \\\"ich\\\"\\n\\n### Replace\\n\\nReplaces the pattern with the content of the replace option. The pattern can be a literal string or a regular expression using the `regexp()` option:\\n\\n`{{replace field_name pattern=\\\"Mi\\\" replace=\\\"At\\\"}}`\\n\\nExample:\\n- Input: `{{replace lead.first_name pattern=\\\"Mi\\\" replace=\\\"At\\\"}}` with `lead.first_name` = \\\"Michael\\\"\\n- Output: \\\"Atchael\\\"\\n\\n`{{replace field_name pattern=\\\"regexp(h.{3})\\\" replace=\\\"ke\\\"}}`\\n\\nExample:\\n- Input: `{{replace lead.first_name pattern=\\\"regexp(h.{3})\\\" replace=\\\"ke\\\"}}` with `lead.first_name` = \\\"Michael\\\"\\n- Output: \\\"Micke\\\"\\n\\n### Extract\\n\\nExtracts all occurrences found with the regular expression in the pattern:\\n\\n`{{extract field_name pattern=\\\"\\\\$begin:math:display$(.*?)\\\\\\\\$end:math:display$\\\"}}`\\n\\nExample:\\n- Input: `{{ extract foo pattern=\\\"(?<=#)(\\\\\\\\w+)(?=#)\\\" }}` with `lead.first_name` = \\\"#John#Doe#Smith\\\"\\n- Output: \\\"John Doe\\\"\\n\\n## Variable Math\\n\\nTo perform math operations, use the `math` helper: `{{ math \\\"1 + 1\\\" }}`\\nresults in `2`. Of course, variables can also be used: `{{ math \\\"1 +\\nlead.random_number\\\" }}` might result in `32` depending on the value\\nof `lead.random_number`. The math expression accepts a pretty basic\\ngrammar. Operators have the normal precedence:\\n\\n| Operator                 | Associativity | Description\\n| ------------------------ | ------------- | ----------\\n| (...)                    | None          | Grouping\\n| f(), x.y                 | Left          | Function call, property access\\n| !                        | Left          | Factorial\\n| ^                        | Right         | Exponentiation\\n| +, -, not, sqrt, etc.    | Right         | Unary prefix operators (see below for the full list)\\n| \\\\*, /, %                 | Left          | Multiplication, division, remainder\\n| +, -, \\\\|\\\\|               | Left          | Addition, subtraction, concatenation\\n| ==, !=, >=, <=, >, <, in | Left          | Equals, not equals, etc. \\\"in\\\" means \\\"is the left operand included in the right array operand?\\\" (disabled by default)\\n| and                      | Left          | Logical AND\\n| or                       | Left          | Logical OR\\n| x ? y : z                | Right         | Ternary conditional (if x then y else z)\\n\\nThere are also several pre-defined functions:\\n\\n| Function      | Description |\\n| ------------- | ----------- |\\n| sin(x)        | Sine of x (x is in radians)\\n| cos(x)        | Cosine of x (x is in radians)\\n| tan(x)        | Tangent of x (x is… well, you know)\\n| asin(x)       | Arc sine of x (in radians)\\n| acos(x)       | Arc cosine of x (in radians)\\n| atan(x)       | Arc tangent of x (in radians)\\n| sqrt(x)       | Square root of x. Result is NaN (Not a Number) if x is negative.\\n| log(x)        | Natural logarithm of x (not base-10). It’s log instead of ln because that’s what JavaScript calls it.\\n| abs(x)        | Absolute value (magnitude) of x\\n| ceil(x)       | Ceiling of x — the smallest integer that’s >= x.\\n| floor(x)      | Floor of x — the largest integer that’s <= x\\n| round(x)      | X, rounded to the nearest integer, using \\\"grade-school rounding\\\"\\n| roundTo(x, n) | Rounds x to n places after the decimal point\\n| exp(x)        | ex (exponential/antilogarithm function with base e)\\n| random(n)     | Get a random number in the range [0, n). If n is zero, or not provided, it defaults to 1.\\n| fac(n)        | n! (factorial of n: “n * (n-1) * (n-2) * … * 2 * 1″)\\n| min(a,b,...)  | Get the smallest (“minimum”) number in the list\\n| max(a,b,...)  | Get the largest (“maximum”) number in the list\\n| pyt(a, b)     | Pythagorean function, i.e. the c in “c2 = a2 + b2“\\n| pow(x, y)     | xy. This is exactly the same as “x^y”. It’s just provided since it’s in the Math object from JavaScript\\n| atan2(y, x)   | arc tangent of x/y. i.e. the angle between (0, 0) and (x, y) in radians\\n| if(c, a, b)   | Function form of c ? a : b\\n\\n#### Example\\n\\nTo calculate the loan-to-value ratio, given a mortgage loan amount and\\nthe value of the home: `{{ math \\\"(lead.mortgage.loan.amount /\\nlead.mortgage.new_property_value) * 100\\\" }}%`. Note that this example\\nexpresses the LTV as a percentage, first by calculating the percentage\\nand then by appending the `%` character outside the variable\\nplaceholder. This could instead be handled using\\n[formatting](#variable-math-formatting).\\n\\n### Variable Math Formatting\\n\\nThe `math` helper supports the same options as the `format` helper for\\nnumbers: `format` and `locale`. For example, to calculate the\\nloan-to-value ratio and format it as a percentage: `{{ math\\n\\\"lead.mortgage.loan.amount / lead.mortgage.new_property_value\\\"\\nformat=\\\"0.[00]%\\\" }}`. This would return the LTV percentage with up to 2\\ndecimal points (i.e. 72.93%) as a string value.\\n\\n## Variable Hashing\\n\\nLeadConduit supports a wide variety of hashing functions that can be\\napplied to variables in a template. The helper name determines the\\nhashing algorithm. For example, to use MD5 to hash the email address use:\\n`{{ md5 lead.email }}`.  All the following hashing algorithms are\\nsupported:\\n  \\n* md4\\n* md5\\n* ripemd\\n* ripemd160\\n* sha1\\n* sha224\\n* sha256\\n* sha384\\n* sha512\\n* whirlpool\\n  \\nMultiple values can be hashed together: `{{ md5 lead.email lead.phone_1 }}`. This can be used to salt the hash \\nalso: `{{ md5 lead.email \\\"this is my salt\\\" }}`. The `salt` option can also be used. This is the equivalent of the \\nlast example: `{{ md5 lead.email salt=\\\"this is my salt\\\" }}`.  \\n\\nHashing supports multiple encodings using the `encoding` option:\\n`{{ md5 lead.email encoding=\\\"base64\\\" }}` results in something like\\n\\\"tkK0IXs0sejTvZFfxlxEUg==\\\". The following encodings are supported:\\n  \\n* `hex` (default)\\n* `base64`\\n* `latin1`\\n\",\"x-tags\":[\"Templates\"]},\"TestStepRequest\":{\"type\":\"object\",\"description\":\"Request body for testing a recipient step integration\",\"properties\":{\"step_config\":{\"type\":\"object\",\"description\":\"Configuration of the step to test\",\"properties\":{\"integration\":{\"$ref\":\"#/components/schemas/Integration\"},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\"},\"entity\":{\"$ref\":\"#/components/schemas/EntitySummary\"}},\"required\":[\"integration\"]},\"submission_data\":{\"oneOf\":[{\"type\":\"object\",\"additionalProperties\":true},{\"type\":\"string\"}],\"description\":\"Raw inbound lead data to process through the source's inbound integration. Supports two modes:\\n\\n**Object** (default): a JSON object in the same format you would POST to the /flows/{flow_id}/sources/{source_id}/submit endpoint with Content-Type: application/json. The endpoint JSON-serializes it and sets Content-Type to application/json automatically.\\n\\n**String**: a raw body string (form-urlencoded, XML, etc.) to pass directly to the inbound integration's request() function. When submission_data is a string, the content_type field is required so the integration knows how to parse it.\\n\\nIn both modes the endpoint runs the source's inbound integration request() function to parse the data and then applies the source's field mappings before passing the result to the recipient integration.\\n\",\"examples\":[{\"fname\":\"Jane\",\"lname\":\"Doe\",\"email\":\"user@example.com\",\"phone\":\"5125551234\"},\"fname=Jane&lname=Doe&email=user%40example.com&phone=5125551234\",\"<lead><fname>Jane</fname><lname>Doe</lname><email>user@example.com</email></lead>\"]},\"content_type\":{\"type\":\"string\",\"description\":\"The MIME type of submission_data when it is provided as a raw string. Required when submission_data is a string; ignored when submission_data is an object. Must match a content type supported by the source's inbound integration. Common values include application/json, application/x-www-form-urlencoded, application/xml, and text/xml.\\n\",\"example\":\"application/x-www-form-urlencoded\"},\"step_credential\":{\"type\":\"object\",\"description\":\"Optional credential for the recipient integration. Required when the integration declares a credential request variable (type ending in _credential). Supports two modes: (1) pass { credential_id: \\\"<id>\\\" } to reference a stored credential by its ID — no other fields are allowed alongside credential_id; (2) pass the full credential object inline (e.g. { type: \\\"user\\\", username: \\\"...\\\", password: \\\"...\\\" }) for credentials that have not been saved yet.\\n\",\"additionalProperties\":true,\"examples\":[{\"credential_id\":\"507f1f77bcf86cd799439011\"},{\"type\":\"user\",\"username\":\"api_user\",\"password\":\"api_pass\"},{\"type\":\"token\",\"token\":\"abc123secret\"}]}},\"required\":[\"step_config\",\"submission_data\"]},\"TestStepResponse\":{\"type\":\"object\",\"description\":\"Result of testing a recipient step through the handler pipeline. The response includes the overall lead outcome and the full set of events generated during processing (source event, recipient event, etc.).\\n\",\"properties\":{\"outcome\":{\"type\":\"string\",\"description\":\"The overall lead outcome. Most integrations return success, failure, or error. A skip outcome means the step's rule set prevented execution.\\n\",\"enum\":[\"success\",\"failure\",\"error\",\"skip\"],\"example\":\"success\"},\"reason\":{\"type\":[\"string\",\"null\"],\"description\":\"The reason for the outcome (typically populated for failure and error outcomes)\",\"example\":null},\"events\":{\"type\":\"array\",\"description\":\"Events generated during pipeline processing. Typically includes a source event and a recipient event, each with their own outcome, reason, and variable snapshot.\\n\",\"items\":{\"type\":\"object\",\"properties\":{\"type\":{\"type\":\"string\",\"enum\":[\"source\",\"recipient\",\"filter\"],\"example\":\"recipient\"},\"outcome\":{\"type\":\"string\",\"enum\":[\"success\",\"failure\",\"error\",\"skip\"],\"example\":\"success\"},\"reason\":{\"type\":[\"string\",\"null\"],\"example\":null},\"billable\":{\"type\":[\"number\",\"null\"],\"example\":1},\"vars\":{\"type\":\"object\",\"additionalProperties\":true,\"description\":\"Variable snapshot at the time the event was generated\"}}}}},\"required\":[\"outcome\",\"reason\",\"events\"]},\"Timestamp\":{\"type\":\"string\",\"format\":\"date-time\"},\"TokenCredential\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/CredentialID\"},\"name\":{\"description\":\"Friendly name for this credential\",\"type\":\"string\"},\"package\":{\"description\":\"The name of the LeadConduit integration package to which this credential belongs\",\"type\":\"string\"},\"type\":{\"description\":\"The credential type\",\"type\":\"string\",\"enum\":[\"token\"]},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"token\":{\"description\":\"The access token to use with type token\",\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\",\"package\",\"type\",\"token\"],\"additionalProperties\":true},\"Transactions\":{\"type\":\"array\",\"description\":\"A list of HTTP transactions that occurred while processing the lead\",\"items\":{\"type\":\"object\",\"description\":\"An HTTP transaction initiated by the integration\",\"properties\":{\"request\":{\"$ref\":\"#/components/schemas/HttpRequest\",\"description\":\"An HTTP request sent by the integration\"},\"response\":{\"$ref\":\"#/components/schemas/HttpResponse\",\"description\":\"An HTTP response received by the integration\"},\"ms\":{\"type\":\"integer\",\"description\":\"The number of milliseconds that elapsed between sending request and receiving the response\"}},\"required\":[\"request\",\"response\",\"ms\"]}},\"TypeName\":{\"type\":\"string\",\"enum\":[\"boolean\",\"city\",\"credential\",\"date\",\"dob\",\"email\",\"first_name\",\"gender\",\"ip\",\"last_name\",\"number\",\"phone\",\"postal_code\",\"range\",\"ssn\",\"state\",\"street\",\"string\",\"time\",\"trustedform_url\",\"url\"],\"x-enumDescriptions\":{\"boolean\":\"A [boolean](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Boolean) is a value that can be interpreted as true or false\",\"city\":\"The name of a [city](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/City) as part of an address\",\"credential\":\"A [credential](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Credential) or other sensitive value. Credentials are not written to the database.\",\"date\":\"A [date](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Date) expressed as a year, month, and day\",\"dob\":\"A [date of birth](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Date-Of-Birth) expressed as a year, month, and day\",\"email\":\"An [email address](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Email)\",\"first_name\":\"A [first name](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/First-Name) value\",\"gender\":\"A value representing [gender](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Gender)\",\"ip\":\"An [IP address](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/IP) value\",\"last_name\":\"A [last name](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Last-Name) value\",\"number\":\"A [numeric](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Number) value\",\"phone\":\"A [US telephone number](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Phone)\",\"postal_code\":\"The [postal code](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Postal-Code) portion of an address\",\"range\":\"A [numeric range](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Range) such as 1-10\",\"ssn\":\"A US [Social Security Number](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/SSN). Not written to the database.\",\"state\":\"The [state](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/State) portion of an address\",\"street\":\"The [street](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Street) portion of an address\",\"string\":\"A generic [string](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/String) value\",\"time\":\"A [date-time](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/Time) value\",\"trustedform_url\":\"The [TrustedForm Certificate URL](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/TrustedForm-URL)\",\"url\":\"A generic [URL](https://developers.activeprospect.com/docs/leadconduit/api/tag/Types/#tag/Types/section/URL)\"}},\"TypeComponent\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"$ref\":\"#/components/schemas/TypeName\"},\"description\":{\"type\":\"string\"}},\"required\":[\"name\",\"type\"]},\"Type\":{\"x-tags\":[\"Fields\"],\"type\":\"object\",\"description\":\"Describes a LeadConduit field data type\",\"properties\":{\"name\":{\"$ref\":\"#/components/schemas/TypeName\"},\"maskable\":{\"type\":\"boolean\",\"description\":\"Are values of this type masked before they are persisted to the LeadConduit database?\"},\"components\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/TypeComponent\"},\"maxItems\":0},\"examples\":{\"type\":\"array\",\"description\":\"Example values for this type, used for testing and documentation\",\"items\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\",\"properties\":{\"normal\":{\"description\":\"The normalized value after parsing (type varies: string, number, boolean, etc.)\",\"oneOf\":[{\"type\":\"string\"},{\"type\":\"number\"},{\"type\":\"boolean\"}]},\"valid\":{\"type\":\"boolean\"},\"raw\":{\"type\":\"string\"}},\"required\":[\"normal\",\"valid\",\"raw\"],\"additionalProperties\":true}]}},\"operators\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"is equal to\",\"is not equal to\",\"is blank\",\"is not blank\",\"is greater than\",\"is greater than or equal to\",\"is less than\",\"is less than or equal to\",\"is true\",\"is not true\",\"is false\",\"is not false\",\"format is valid\",\"format is invalid\",\"includes\",\"does not include\",\"is included in\",\"is not included in\",\"is between\",\"is not between\",\"matches pattern\",\"does not match pattern\"],\"minLength\":1}}},\"required\":[\"name\",\"operators\",\"components\"]},\"unary-rule\":{\"title\":\"Unary Rule\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ShortID\",\"description\":\"ID for this rule\"},\"lhv\":{\"$ref\":\"#/components/schemas/Template\",\"description\":\"The value to be evaluated ([templating](https://developers.activeprospect.com/docs/leadconduit/api/tag/Templates/) is supported)\",\"example\":\"lead.email\"},\"op\":{\"type\":\"string\",\"enum\":[\"is blank\",\"is not blank\",\"is true\",\"is false\",\"is not true\",\"is not false\",\"format is valid\",\"format is invalid\",\"is obscene\",\"is not obscene\"],\"x-enumDescriptions\":{\"is blank\":\"Is the `lhv` missing or empty?\",\"is not blank\":\"Does the `lhv` contain a value?\",\"is true\":\"Does the `lhv` evaluate to `true`?\",\"is false\":\"Does the `lhv` evaluate to `false`?\",\"format is valid\":\"The `lhv` was successfully interpreted as a value of its specified type.\",\"format is invalid\":\"The `lhv` could not be interpreted as a value of its specified type.\",\"is obscene\":\"Does the `lhv` contain obscene language?\",\"is not obscene\":\"Does the `lhv` contain no obscene language?\"},\"example\":\"is not blank\",\"description\":\"Unary operators evaluate the `lhv`.\\n\"},\"rule_set\":{\"$ref\":\"#/components/schemas/RuleSet\"}},\"additionalProperties\":false,\"required\":[\"lhv\",\"op\"]},\"UpdateSubmissionDocsAccessLogsVisibility\":{\"type\":\"object\",\"properties\":{\"ui_state\":{\"description\":\"Submission docs access logs visibility\",\"type\":\"object\",\"properties\":{\"hidden\":{\"description\":\"Whether the submission docs access logs will be retrieved by the query endpoint\",\"type\":\"boolean\"}}}}},\"UserCredential\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/CredentialID\"},\"name\":{\"description\":\"Friendly name for this credential\",\"type\":\"string\"},\"package\":{\"description\":\"The name of the LeadConduit integration package to which this credential belongs\",\"type\":\"string\"},\"type\":{\"description\":\"The credential type\",\"type\":\"string\",\"enum\":[\"user\"]},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"username\":{\"description\":\"The username to use for basic authentication\",\"type\":\"string\",\"minLength\":1},\"password\":{\"description\":\"The password to use for basic authentication\",\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\",\"package\",\"type\",\"username\",\"password\"],\"additionalProperties\":true},\"UserID\":{\"allOf\":[{\"$ref\":\"#/components/schemas/ID\"},{\"type\":\"string\",\"description\":\"The unique ID of a user\",\"example\":\"5fd4371e940df5a34a3888b2\"}]},\"UserSettings\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/UserID\",\"description\":\"The ID of the setting which uniquely identifies it, same as user ID\"},\"notifications\":{\"type\":\"object\",\"description\":\"User notification settings\",\"properties\":{\"submission_doc_updates\":{\"type\":\"object\",\"properties\":{\"enabled\":{\"type\":\"boolean\",\"default\":true},\"unsubscribed_at\":{\"oneOf\":[{\"type\":\"null\"},{\"type\":\"string\",\"format\":\"date-time\"}]}}},\"connection_invites\":{\"type\":\"object\",\"properties\":{\"enabled\":{\"type\":\"boolean\",\"default\":true},\"unsubscribed_at\":{\"oneOf\":[{\"type\":\"null\"},{\"type\":\"string\",\"format\":\"date-time\"}]}}}}},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"readOnly\":true}},\"required\":[\"id\",\"notifications\"],\"additionalProperties\":false},\"UserSubscription\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/ID\"},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"active_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"inactive_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"state\":{\"type\":\"string\"},\"account_id\":{\"$ref\":\"#/components/schemas/AccountID\"},\"product_offering_id\":{\"type\":\"string\"},\"product_offering\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"product_id\":{\"type\":\"string\"},\"component\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}}}}},\"UserUpdate\":{\"type\":\"object\",\"properties\":{\"ui_state\":{\"description\":\"User interface state\",\"type\":\"object\",\"properties\":{\"has_seen_free_account_modal\":{\"description\":\"Whether the user has seen the free account modal\",\"type\":\"boolean\"}}}}},\"Var\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"last_used_at\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"first_used_at\":{\"$ref\":\"#/components/schemas/Timestamp\"},\"type\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"module_id\":{\"type\":\"string\"},\"entity_id\":{\"$ref\":\"#/components/schemas/EntityID\"},\"examples\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"name\",\"label\"]},\"VariableAccountMetadata\":{\"title\":\"Account Metadata\",\"description\":\"Variables prefixed with `account.` are metadata about the account handled the lead. Account variables are created \\nautomatically when a lead is submitted.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/AccountID\",\"description\":\"The unique ID of the account\"},\"sso_id\":{\"$ref\":\"#/components/schemas/SsoID\"},\"name\":{\"description\":\"The name of the source\",\"type\":\"string\",\"example\":\"A Corporation\"}}},\"VariableAppendedData\":{\"type\":\"object\",\"title\":\"Appended Variables\",\"description\":\"Variables prefixed with anything other than a metadata prefix or the `lead.` prefix\\nare appended data.\\n\\nEach recipient step appends data in a special key, specified by the `key` property\\non the recipient event.\\n\",\"additionalProperties\":true},\"VariableFeedbackMetadata\":{\"title\":\"Feedback Metadata\",\"description\":\"Variables prefixed with `feedback.` are metadata about lead feedback.\\nFeedback variables are created automatically when feedback is provided.\\n\",\"type\":\"object\",\"properties\":{\"timestamp\":{\"description\":\"The time the feedback was provided\",\"$ref\":\"#/components/schemas/Timestamp\"},\"type\":{\"description\":\"The type of feedback provided (return or conversion)\",\"type\":\"string\"},\"reason\":{\"description\":\"The underlying reason why feedback was provided\",\"type\":\"string\"}}},\"VariableFlowMetadata\":{\"title\":\"Flow Metadata\",\"description\":\"Variables prefixed with `flow`. are metadata about the flow that\\nhandled the lead. Flow variables are created automatically when a lead\\nis submitted.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"description\":\"The unique ID of the flow\",\"$ref\":\"#/components/schemas/FlowID\"},\"name\":{\"description\":\"The name of the flow\",\"type\":\"string\"}}},\"VariableLeadData\":{\"type\":\"object\",\"title\":\"Lead Data\",\"description\":\"Variables prefixed with `lead.` are lead variables. Lead variables are\\ncreated when a lead is submitted by a source to a flow. These variables\\ntypically contain data that was collected from the consumer on a web\\nform.\\n\\nEach variable name corresponds to a\\n[field](https://developers.activeprospect.com/docs/leadconduit/api/tag/Fields/)\\nID. If the source submits a piece of data and the matching field ID has\\nnot been added to the flow, then a variable with that data will not be\\ncreated. If the source needs to submit data using a parameter that does\\nnot have a matching field name, then a mapping\\nmust be added to map the source's parameter to the field name. For\\nexample, if a source submits `fname=Joe` then a mapping must be added\\nin order to create the `lead.first_name` variable with the value \\\"Joe\\\".\\n\\nFor a list of all possible lead variables that are available \\\"out of\\nthe box\\\" in LeadConduit, simply prepend `lead.` to any of the standard\\nfield IDs.\\n\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/LeadID\"}},\"additionalProperties\":true},\"VariableRecipientMetadata\":{\"title\":\"Recipient Metadata\",\"description\":\"Variables prefixed with `recipient.` are metadata about the recipient\\nthat received the lead. Recipient variables are created automatically\\nwhen a lead is submitted to a recipient. These variables are only\\npresent on recipient events.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"description\":\"The unique ID of the recipient\",\"$ref\":\"#/components/schemas/EntityID\"},\"name\":{\"description\":\"The name of the recipient\",\"type\":\"string\"}}},\"VariableSourceMetadata\":{\"title\":\"Source Metadata\",\"description\":\"Variables prefixed with `source.` are metadata about the source that\\nsubmitted the lead. Source variables are created automatically when a\\nlead is submitted.\\n\",\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/EntityID\",\"description\":\"The unique ID of the source\"},\"name\":{\"description\":\"The name of the source\",\"type\":\"string\",\"example\":\"A Corporation\"}}},\"VariableSubmissionMetadata\":{\"title\":\"Submission Metadata\",\"description\":\"Variables prefixed with `submission.` are metadata about an actual lead\\nsubmission. Submission variables are created automatically when a lead\\nis submitted.\\n\",\"type\":\"object\",\"properties\":{\"timestamp\":{\"description\":\"The time the lead was submitted\",\"$ref\":\"#/components/schemas/Timestamp\"},\"ip\":{\"description\":\"The IP address from which the lead was submitted\",\"type\":\"string\"}}},\"Variables\":{\"x-tags\":[\"Variables\"],\"type\":\"object\",\"anyOf\":[{\"$ref\":\"#/components/schemas/VariableLeadData\"},{\"$ref\":\"#/components/schemas/VariableAccountMetadata\"},{\"$ref\":\"#/components/schemas/VariableFlowMetadata\"},{\"$ref\":\"#/components/schemas/VariableSubmissionMetadata\"},{\"$ref\":\"#/components/schemas/VariableSourceMetadata\"},{\"$ref\":\"#/components/schemas/VariableRecipientMetadata\"},{\"$ref\":\"#/components/schemas/VariableFeedbackMetadata\"}]},\"VersionUi\":{\"title\":\"Version UI\",\"description\":\"Returns the current UI app version.\",\"type\":\"object\",\"properties\":{\"version\":{\"type\":\"string\"}}}}},\"x-tagGroups\":[{\"name\":\"API Endpoints\",\"tags\":[\"Flows\",\"Leads\",\"Events\",\"Exports\",\"Fields\",\"Entities\",\"Destinations\",\"Changelogs\",\"Reports\",\"Caps and Limits\",\"Firehose\",\"Routers\",\"Account\",\"Connections\",\"Invitations\",\"Onboards\",\"System\"]},{\"name\":\"Concepts\",\"tags\":[\"Rules\",\"Variables\",\"Types\",\"Templates\"]}]}},\"options\":{\"hideTryItPanel\":false,\"pagination\":\"section\",\"hideInfoSection\":true,\"noAutoAuth\":true,\"jsonSampleExpandLevel\":\"all\",\"showConsole\":true,\"generateCodeSamples\":{\"languages\":[{\"lang\":\"curl\"},{\"lang\":\"Node.js\"},{\"lang\":\"Ruby\"}]},\"corsProxyUrl\":\"https://cors.redoc.ly\",\"disableSearch\":true,\"ctrlFHijack\":false,\"disableSidebar\":true,\"theme\":{\"overrides\":{\"DownloadButton\":{\"custom\":\"\"},\"NextSectionButton\":{\"custom\":\"\"}},\"codeBlock\":{\"tokens\":{}},\"schema\":{\"constraints\":{},\"examples\":{}},\"rightPanel\":{\"textColor\":\"#eeeeee\"},\"typography\":{\"heading1\":{},\"heading2\":{},\"heading3\":{},\"rightPanelHeading\":{}}}}}","redocHasSecurityDefinitions":false,"redocInfoPageLink":"/docs/leadconduit/api/overview/","redocItemId":"tag/Exports","redocHasInfoPage":false,"settings":{"hideInfoSection":true,"noAutoAuth":true,"jsonSampleExpandLevel":"all","pagination":"section","showConsole":true,"generateCodeSamples":{"languages":[{"lang":"curl"},{"lang":"Node.js"},{"lang":"Ruby"}]},"corsProxyUrl":"https://cors.redoc.ly"},"requestLogin":false,"lastModified":"2023-11-10T15:14:05.000Z"},"seo":{"title":"Exports"}}},"pageContext":{"id":"552f72da-deca-5ce8-b870-9fb109b1bb5etag/Exports/__redocly content/docs/leadconduit/api/tag/Exports/","seo":{"title":"Exports","description":"","image":"","keywords":null,"jsonLd":null,"lang":null,"siteUrl":null},"pageId":"docs/leadconduit/api.page.yaml#tag/Exports/","pageBaseUrl":"/docs/leadconduit/api","type":"redoc-operation","toc":{"enable":false,"maxDepth":4,"headings":null},"data":{},"catalogInfo":null,"link":"/docs/leadconduit/api/tag/Exports/","sidebarName":"activeprospect","isLanding":false,"showPrevButton":null,"showNextButton":null,"apiVersions":[{"definitionId":"leadconduit_api_v1","id":"v1","title":"v1","isDefault":true,"apiId":null}],"apiVersionId":null,"isDefaultApiVersion":true}},"staticQueryHashes":["1123603147","1302185487","1344209882","1398840060","1520077861","1975142765","2667623876","2950305614","3240152602","3743992808","561138138"]}