# Create a new credential Source: https://developers.activeprospect.com/api-reference/account/create-a-new-credential /api-reference/leadconduit_api.json post /credentials Create a new credential # Create user settings Source: https://developers.activeprospect.com/api-reference/account/create-user-settings /api-reference/leadconduit_api.json post /user_settings Create a new user settings document, adding it to the list of all user settings in the account. # Delete a credential Source: https://developers.activeprospect.com/api-reference/account/delete-a-credential /api-reference/leadconduit_api.json delete /credentials/{id} Deletes the credential matching the specified ID # Get a credential Source: https://developers.activeprospect.com/api-reference/account/get-a-credential /api-reference/leadconduit_api.json get /credentials/{id} Returns the credential matching the specified ID # Get a user settings Source: https://developers.activeprospect.com/api-reference/account/get-a-user-settings /api-reference/leadconduit_api.json get /user_settings/{id} Fetch a single user settings document. # Get account Source: https://developers.activeprospect.com/api-reference/account/get-account /api-reference/leadconduit_api.json get /account Returns the account information of the caller (based on authentication) # Get user Source: https://developers.activeprospect.com/api-reference/account/get-user /api-reference/leadconduit_api.json get /user This singleton resource returns the currently authenticated user # List all credentials Source: https://developers.activeprospect.com/api-reference/account/list-all-credentials /api-reference/leadconduit_api.json get /credentials Get the list of all credentials. # Sync account data from SSO Source: https://developers.activeprospect.com/api-reference/account/sync-account-data-from-sso /api-reference/leadconduit_api.json post /account_sso_sync Syncs account data from SSO using the provided `sso_account_id`. # Update a credential Source: https://developers.activeprospect.com/api-reference/account/update-a-credential /api-reference/leadconduit_api.json put /credentials/{id} Update an existing credential matching the specified ID # Update a user settings Source: https://developers.activeprospect.com/api-reference/account/update-a-user-settings /api-reference/leadconduit_api.json put /user_settings/{id} Update an existing user settings document. # Update account Source: https://developers.activeprospect.com/api-reference/account/update-account /api-reference/leadconduit_api.json put /account Update my account information # Update user Source: https://developers.activeprospect.com/api-reference/account/update-user /api-reference/leadconduit_api.json put /user/{id} Resource for User or user admin to toggle modal flag # Fetch a ping limit counter Source: https://developers.activeprospect.com/api-reference/caps-and-limits/fetch-a-ping-limit-counter /api-reference/leadconduit_api.json get /ping_limits/{id} Get a counter for a single ping limit. # Get a cap counter Source: https://developers.activeprospect.com/api-reference/caps-and-limits/get-a-cap-counter /api-reference/leadconduit_api.json get /caps/{id} Returns the cap associated to the ID # List all cap counters Source: https://developers.activeprospect.com/api-reference/caps-and-limits/list-all-cap-counters /api-reference/leadconduit_api.json get /caps Get the counters for all active caps. Caps that haven't received lead traffic during the current interval will not be included. # List all ping limit counters Source: https://developers.activeprospect.com/api-reference/caps-and-limits/list-all-ping-limit-counters /api-reference/leadconduit_api.json get /ping_limits Get the counters for all active ping limits. Ping limits that haven't received ping traffic during the current interval will not be included. # Run Certificate Operations Source: https://developers.activeprospect.com/api-reference/certificate-url/run-certificate-operations /api-reference/claims_api-v4.yaml post /{cert_id} The TrustedForm Certificate API is able to perform multiple operations based on the parameters sent in the request. Each operation is demonstrated in the request body documentation. The overall outcome of the operations is revealed by the `outcome` property. Best practice is to base your purchase decision on this property. Separate documentation about the parameters and results of each operation is available in the Operations reference. and can be used alone or in tandem with another operation. The `match_lead` operation is required when running the `retain` operation. # Get a changelog Source: https://developers.activeprospect.com/api-reference/changelogs/get-a-changelog /api-reference/leadconduit_api.json get /changelogs/{id} Returns the changelog matching the specified ID # List all changelogs Source: https://developers.activeprospect.com/api-reference/changelogs/list-all-changelogs /api-reference/leadconduit_api.json get /changelogs Get the list of all changelogs. # List changes to a Flow Source: https://developers.activeprospect.com/api-reference/changelogs/list-changes-to-a-flow /api-reference/leadconduit_api.json get /flows/{id}/changelogs Lists all the changes made to a flow # Claiming a Certificate Source: https://developers.activeprospect.com/api-reference/claiming-certificates/claiming-a-certificate /api-reference/trustedform_v3.json post /{cert_id} TrustedForm account holders who are receiving certified leads can use the TrustedForm API to claim the certificate provided with each lead. Doing so 1. Verifies the legitimacy of the certificate 2. Stores the certificate for future reference and 3. Provides programmatic access to the information shown on the certificate To claim a certificate using the TrustedForm API, send an HTTP POST request to the certificate URL sent by your publisher. Do not make a request unless the URL starts with https://cert.trustedform.com, otherwise you may expose your TrustedForm credentials to someone else - Use a POST request — any other type of request will not claim the certificate - Use the Accept: application/json request header - Use the Content-Type: application/json or Content-Type: application/x-www-form-urlencoded header, and encode the request body accordingly. - In the Authorization header, use the API key provided on the "Settings" tab in the TrustedForm Application and the username 'API'. ### Page Scanning As part of the claiming process, it's often required that certain language either exists or doesn't exist on the page. For example, you may want to ensure certain consent language exists. As another example, you may want to ensure other language does not exist, such as "free iPhone". #### Page Scanning Params You can use the `required_scan_terms` and `forbidden_scan_terms` parameters. - `required_scan_terms`: Use this parameter to scan for language you want to ensure exist on the page. - `forbidden_scan_terms`: Use this parameter to scan for language you want to ensure does not exist on the page. Often, you will want to scan against a variety of possible texts. The TrustedForm Claiming API enables you to do this in three ways: 1. Send the variations as a list using `required_scan_terms[]` or `forbidden_scan_terms[]` 2. Use wildcards in the consent language. 3. Use templates. You can use a mixture of all three. #### Wildcards Use `{{*}}` in the consent language you wish to scan for as a wildcard. For Example, passing "on behalf of `{{*}}` at the telephone number" will match "on behalf of Mortgage Acme at the telephone number". Like using exact language, scans using wildcards can be sent in as an array. #### Templating Templating is different than other versions of page scanning in that you must 1) send it as JSON (i.e. Content-type of application/json); 2) provide a list of key/values to use in the template. If we were to use the example from above, we might use the following templates: ```json { "required_scan_terms": [ { "template": "on behalf of {{company}} at the telephone number", "variables": [ {"company": "Mortgage Acme"}, {"company": "Acme Mortgage"}, {"company": "Acme Co."} ] }, { "template": "on behalf of {{company}} at the {{contact_method}}", "variables": [ {"company": "Mortgage Acme", "contact_method": "email"}, {"company": "Acme Mortgage", "contact_method": "fax number"}, {"company": "Acme Mortgage", "contact_method": "email"}, {"company": "Acme Co.", "contact_method": "email"} ] } ] } ``` #### Scan Delimiters When using wildcards in page scans and page scan templates, the default method is to surround the wildcard or template key with "handlebar" braces (`{{}}`). If that conflicts with your system, you can provide your own delimiter to use. Currently, TrustedForm only allows homogeneous delimiters (i.e. the beginning and end are the same character(s)) such as `**`, `|`, or even `+++`. ### Sandboxed Certificates Certificates created with the `sandbox` flag set to `true` cannot be claimed. # Claiming Certificates Source: https://developers.activeprospect.com/api-reference/claiming-certificates/claiming-certificates /api-reference/trustedform_v2.yaml post /{cert_id} ### Testing TrustedForm account holders who are receiving certified leads can use the TrustedForm API to claim the certificate provided with each lead. Doing so 1. Verifies the legitimacy of the certificate 2. Stores the certificate for future reference and 3. Provides programmatic access to the information shown on the certificate To claim a certificate using the TrustedForm API, send an HTTP POST request to the certificate URL sent by your publisher. Do not make a request unless the URL starts with `https://cert.trustedform.com`, otherwise you may expose your TrustedForm credentials to someone else - Use a POST request — any other type of request will not claim the certificate - Use the `Accept: application/json` request header - Use the `Content-Type: application/json` or `Content-Type: application/x-www-form-url` encoded header, and encode the request body accordingly. - In the Authorization header, use the API key provided on the "Settings" tab in the TrustedForm Application and the username 'API'. ### Page Scanning As part of the claiming process, it's often required that certain language either exists or doesn't exist on the page. For example, you may want to ensure certain consent language exists. As another example, you may want to ensure other language does not exist, such as "free iPhone". In both cases, you can provide the language to "scan" for using the `scan` and `scan!` parameters. - `scan`: Use this parameter to scan for language you want to ensure exist on the page. - `scan!`: Use this parameter to scan for language you want to ensure does not exist on the page. Often, you will want to scan against a variety of possible texts. The TrustedForm Claiming API enables you to do this in three ways: 1. Send the variations as a list using `scan[]` or `scan![]` 2. Use wildcards in the consent language. 3. Use templates. You can use a mixture of all three. #### Wildcards Use `{{*}}` in the consent language you wish to scan for as a wildcard. For Example, passing "on behalf of `{{*}}` at the telephone number" will match "on behalf of Mortgage Acme at the telephone number". Like using exact language, scans using wildcards can be sent in as an array. #### Templating Templating is different than other versions of page scanning in that you must 1) send it as JSON (i.e. Content-type of application/json); 2) provide a list of key/values to use in the template. If we were to use the example from above, we might use the following templates: ```json { "scan": [ { "template": "on behalf of {{company}} at the telephone number", "variable_maps": [ {"company": "Mortgage Acme"}, {"company": "Acme Mortgage"}, {"company": "Acme Co."} ] }, { "template": "on behalf of {{company}} at the {{contact_method}}", "variable_maps": [ {"company": "Mortgage Acme", "contact_method": "email"}, {"company": "Acme Mortgage", "contact_method": "fax number"}, {"company": "Acme Mortgage", "contact_method": "email"}, {"company": "Acme Co.", "contact_method": "email"} ] } ] } ``` ### Sandboxed Certificates Certificates created with the `sandbox` flag set to `true` cannot be claimed. # Get connection by ID Source: https://developers.activeprospect.com/api-reference/connections/get-connection-by-id /api-reference/leadconduit_api.json get /connections/{id} 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. # List all destinations configured for the account Source: https://developers.activeprospect.com/api-reference/destinations/list-all-destinations-configured-for-the-account /api-reference/leadconduit_api.json get /destinations The `/destinations` resource is used to query destinations which have been configured in the LeadConduit app. If no destinations are configured for your account, this resource will return an empty array. Destinations returned from this endpoint can be [added to flows](/docs/leadconduit/api/tag/Flows/#tag/Flows/operation/updateFlow). # Create a new entities Source: https://developers.activeprospect.com/api-reference/entities/create-a-new-entities /api-reference/leadconduit_api.json post /entities Create a new entities # Delete a entity Source: https://developers.activeprospect.com/api-reference/entities/delete-a-entity /api-reference/leadconduit_api.json delete /entities/{id} Deletes the entity matching the specified ID # Get a entity Source: https://developers.activeprospect.com/api-reference/entities/get-a-entity /api-reference/leadconduit_api.json get /entities/{id} Returns the entity matching the specified ID # List all entities Source: https://developers.activeprospect.com/api-reference/entities/list-all-entities /api-reference/leadconduit_api.json get /entities Get the list of all entities. # List changes to an Entity Source: https://developers.activeprospect.com/api-reference/entities/list-changes-to-an-entity /api-reference/leadconduit_api.json get /entities/{id}/changelogs List all the changes made to an entity # Update a entity Source: https://developers.activeprospect.com/api-reference/entities/update-a-entity /api-reference/leadconduit_api.json put /entities/{id} Update an existing entity matching the specified ID # Get event metrics counts Source: https://developers.activeprospect.com/api-reference/events/get-event-metrics-counts /api-reference/leadconduit_api.json get /events/event-metrics/count Returns event count for the given timeframe and filters (Keen `leadconduit.events`). **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. **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: - property_name `vars.lead.trustedform_cert_url`, operator `is blank` - property_name `vars.trustedform`, operator `is blank` The 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. # Get funnel event metrics Source: https://developers.activeprospect.com/api-reference/events/get-funnel-event-metrics /api-reference/leadconduit_api.json get /events/event-metrics/funnel # Get median event metrics Source: https://developers.activeprospect.com/api-reference/events/get-median-event-metrics /api-reference/leadconduit_api.json get /events/event-metrics/median # Get unique event metrics counts Source: https://developers.activeprospect.com/api-reference/events/get-unique-event-metrics-counts /api-reference/leadconduit_api.json get /events/event-metrics/count_unique # Select unique event metrics Source: https://developers.activeprospect.com/api-reference/events/select-unique-event-metrics /api-reference/leadconduit_api.json get /events/event-metrics/select_unique # Create a field Source: https://developers.activeprospect.com/api-reference/fields/create-a-field /api-reference/leadconduit_api.json post /fields Create a new custom field, adding it to the list of all fields in the account. # Delete a field Source: https://developers.activeprospect.com/api-reference/fields/delete-a-field /api-reference/leadconduit_api.json delete /fields/{id} Delete an existing custom field. If a field is referenced in a flow and is deleted, an HTTP 202 will be returned but that flow will continue to operate as though the field still exists. The errors for each flow will be returned to the response body and the recorded on the flow's error property. More changes to the flow must dereference the field. Standard fields cannot be deleted. # Get a field Source: https://developers.activeprospect.com/api-reference/fields/get-a-field /api-reference/leadconduit_api.json get /fields/{id} Fetch a single field. # List all fields Source: https://developers.activeprospect.com/api-reference/fields/list-all-fields /api-reference/leadconduit_api.json get /fields Get the list of all fields, including all standard and custom fields. Optionally, provide a `flow_id` query parameter to return only the fields referenced by a specific flow. # List changes to a Field Source: https://developers.activeprospect.com/api-reference/fields/list-changes-to-a-field /api-reference/leadconduit_api.json get /fields/{id}/changelogs Lists all the changes made to a Field # List data types Source: https://developers.activeprospect.com/api-reference/fields/list-data-types /api-reference/leadconduit_api.json get /types Lists the data [types](/docs/leadconduit/api/tag/Types/) available for fields or vars # List variables Source: https://developers.activeprospect.com/api-reference/fields/list-variables /api-reference/leadconduit_api.json get /vars The `/vars` resource is used to identify which data points have been collected in your flows. This resource is used to determine which data points are available for exports and stats queries. As a lead is processed by a flow, a variable for every field value and every piece of appended data is created. If the variable for a data point already exists, a new one is not created. That is to say that there will only ever be one `lead.email` variable. Each time an email address is collected, the `last_seen_at` timestamp is updated. # Update a field Source: https://developers.activeprospect.com/api-reference/fields/update-a-field /api-reference/leadconduit_api.json put /fields/{id} Update an existing custom field. Standard fields cannot be updated. # Test firehose's ability to write to AWS S3 or Azure Blob Storage Source: https://developers.activeprospect.com/api-reference/firehose/test-firehoses-ability-to-write-to-aws-s3-or-azure-blob-storage /api-reference/leadconduit_api.json get /firehose The `/firehose` resource is used to validate cloud storage credentials and test write access to a specified bucket/container. **AWS S3 Validation:** - Creates a test file with unique name `leadconduit_verification_[flow_id_]YYYYMMDDHHMMSSMS.txt` - File location: `/filename` (if prefix provided) or `filename` (root of bucket) - Returns S3 putObject response with ETag on success - Can validate credentials without creating file when `verification_file=false` **Azure Blob Storage Validation:** - Validates credentials by checking container existence and access permissions - Optionally creates verification file based on `verification_file` parameter - Returns container validation information on success **Required Parameters:** - For AWS: `access_key_id`, `secret_access_key`, `bucket` - For Azure: `connection_string`, `bucket` (container name) - The `service` parameter determines which validation method is used **Optional Parameters:** - `flow_id`: Include flow ID in verification filename for better tracking - `verification_file`: Control whether verification file is created (default: true) # Create a new flow Source: https://developers.activeprospect.com/api-reference/flows/create-a-new-flow /api-reference/leadconduit_api.json post /flows 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 # Delete an existing flow Source: https://developers.activeprospect.com/api-reference/flows/delete-an-existing-flow /api-reference/leadconduit_api.json delete /flows/{id} 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. # Deploy a saved flow to production Source: https://developers.activeprospect.com/api-reference/flows/deploy-a-saved-flow-to-production /api-reference/leadconduit_api.json post /flows/{id}/deploy 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. # Get a flow Source: https://developers.activeprospect.com/api-reference/flows/get-a-flow /api-reference/leadconduit_api.json get /flows/{id} Returns the flow associated to the ID # Get flow field usages Source: https://developers.activeprospect.com/api-reference/flows/get-flow-field-usages /api-reference/leadconduit_api.json get /flows/{id}/fields/usage 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. # List all flows Source: https://developers.activeprospect.com/api-reference/flows/list-all-flows /api-reference/leadconduit_api.json get /flows Returns all the flows associated to an account # List fields associated to the Flow Source: https://developers.activeprospect.com/api-reference/flows/list-fields-associated-to-the-flow /api-reference/leadconduit_api.json get /flows/{id}/fields List fields associated to the Flow # Retrieve metadata for a specific source within a flow Source: https://developers.activeprospect.com/api-reference/flows/retrieve-metadata-for-a-specific-source-within-a-flow /api-reference/leadconduit_api.json get /flows/{flow_id}/sources/{source_id}/meta Returns metadata about a source within a specified flow, including parameters, account details, and operational settings. # Submit data to a source within a flow Source: https://developers.activeprospect.com/api-reference/flows/submit-data-to-a-source-within-a-flow /api-reference/leadconduit_api.json post /flows/{flow_id}/sources/{source_id}/submit Submits JSON lead data to a specified source within a flow and returning a success response in JSON. # Update all flows Source: https://developers.activeprospect.com/api-reference/flows/update-all-flows /api-reference/leadconduit_api.json put /flows Update all flows for an account. Only users with superuser access can run this. # Update an existing flow Source: https://developers.activeprospect.com/api-reference/flows/update-an-existing-flow /api-reference/leadconduit_api.json put /flows/{id} Update an existing Flow # Create a recipient invitation Source: https://developers.activeprospect.com/api-reference/invitations/create-a-recipient-invitation /api-reference/leadconduit_api.json post /invitations/recipient Send an invitation to Account's Team and return a recipient pending entity # Create a source invitation Source: https://developers.activeprospect.com/api-reference/invitations/create-a-source-invitation /api-reference/leadconduit_api.json post /invitations/source Send an invitation to Account's Team and return a source pending entity # Resend an invitation Source: https://developers.activeprospect.com/api-reference/invitations/resend-an-invitation /api-reference/leadconduit_api.json put /invitations/{entityId}/resend Resend an expired or pending invitation. Updates the expiration date and resets the invitation status. Works for both source and recipient invitations. # About Source: https://developers.activeprospect.com/api-reference/leadconduit This documentation is a technical manual for the LeadConduit API. It is primarily intended to be read by software developers who want to integrate another system with LeadConduit. The API is RESTful and speaks JSON over HTTPS. In general, anything that can be accomplished by pointing and clicking in the LeadConduit user interface can also be done using the API. ## Conventions This documentation provides examples that show how to interact with the API. Examples are shown in monospaced blocks like the one shown below: ``` Examples are presented in blocks like this one ``` You may also see monospaced font inline `like this`. This text represents a literal value or expression to be used with the API. ## Questions If you have a question, or spot an error in the documentation, or just generally need to speak with someone about the API, email [support@activeprospect.com](mailto:support@activeprospect.com). # Account Source: https://developers.activeprospect.com/api-reference/leadconduit/account The authenticated user reveals the details of the API caller's user account as well as certain details about the account of which the user is member. The `products` array reveals all ActiveProspect products and to which the caller's account is subscribed. # Account Source: https://developers.activeprospect.com/api-reference/leadconduit/account/account # User Source: https://developers.activeprospect.com/api-reference/leadconduit/account/authenticateduser # Credential Source: https://developers.activeprospect.com/api-reference/leadconduit/account/credential # Caps and Limits Source: https://developers.activeprospect.com/api-reference/leadconduit/caps-and-limits LeadConduit supports two controls that set constraints on lead submissions and pings. ### Cap A cap allows limiting the number of leads sent to a flow. If a lead is successful, it will be counted against the `maximum` configured leads. If configured, the rule set will be evaluated to determine whether a lead will be counted against the cap. # Cap Source: https://developers.activeprospect.com/api-reference/leadconduit/caps-and-limits/cap # Cap counter Source: https://developers.activeprospect.com/api-reference/leadconduit/caps-and-limits/cap-counter # Pinglimit Source: https://developers.activeprospect.com/api-reference/leadconduit/caps-and-limits/pinglimit # Pinglimit counter Source: https://developers.activeprospect.com/api-reference/leadconduit/caps-and-limits/pinglimit-counter # Changelogs Source: https://developers.activeprospect.com/api-reference/leadconduit/changelogs A changelog represents a creation, update, or deletion of a model such as `Flow`, `Entity`, or `Field`. Every change made will log the exact difference between the previous revision and the current one, as well as what user was logged in and what account the change was made on. Contained within the changelog is the full revision of the model changed at the state after the change was applied, as well as the differences between the previous revision and current revision. # Changelog Source: https://developers.activeprospect.com/api-reference/leadconduit/changelogs/changelog # Connections Source: https://developers.activeprospect.com/api-reference/leadconduit/connections Account connections with other LC accounts # Destinations Source: https://developers.activeprospect.com/api-reference/leadconduit/destinations Destinations are similar to a recipient step in a flow; they represent an external system which receives lead data at the end of a flow. Data is sent to a Destination if all prior steps have completed successfully, and are skipped if an error occurs in a prior step. Destinations are configured once and then globally available within all of an account's flows. Destinations must be configured within the [LeadConduit app](https://app.leadconduit.com), and cannot be configured directly via the API. However, once a destination is configured, it can be queried via the API. Configured destinations can also be added to flows via the API. # Destination Source: https://developers.activeprospect.com/api-reference/leadconduit/destinations/destination # Entities Source: https://developers.activeprospect.com/api-reference/leadconduit/entities An entity is used to track lead flow. Each entity can be a source or a recipient or both. Entities can be used in multiple flows. When an entity is a source, it can be added to a flow as a source and when it is a recipient, it can be added to a flow as a recipient. # Entity Source: https://developers.activeprospect.com/api-reference/leadconduit/entities/entity # Field Source: https://developers.activeprospect.com/api-reference/leadconduit/fields/field # Type Source: https://developers.activeprospect.com/api-reference/leadconduit/fields/type # Firehose Source: https://developers.activeprospect.com/api-reference/leadconduit/firehose # Firehose Multi-Service Configuration ## Overview Each flow is separately configured to use the firehose. This API allows firehose configuration to be tested before it is set on a flow. The 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. ## Configuration Structure ### Legacy Configuration (Backward Compatible) For existing flows, the legacy configuration continues to work: ```json theme={null} { "firehose": { "enabled": true, "credential_id": "507f1f77bcf86cd799439011", "bucket": "my-s3-bucket", "prefix": "events/production" } } ``` ### New Service-Based Configuration The new service-based configuration allows multiple cloud storage providers: ```json theme={null} { "firehose": { "enabled": true, "services": { "aws": { "enabled": true, "credential_id": "507f1f77bcf86cd799439011", "bucket": "my-s3-bucket", "prefix": "events/aws" }, "azure": { "enabled": true, "credential_id": "507f1f77bcf86cd799439012", "bucket": "my-azure-container", "prefix": "events/azure" } } } } ``` ## Credential Validation ### AWS S3 Validation The `/firehose` endpoint validates AWS credentials by: 1. Creating a test file with unique name: `leadconduit_verification_[flow_id_]YYYYMMDDHHMMSSMS.txt` 2. Uploading it to the specified bucket (with optional prefix) when `verification_file=true` (default) 3. Alternatively, validating bucket access without creating file when `verification_file=false` 4. Returning the S3 response with ETag or validation confirmation **Example Requests:** *Basic validation (creates file):* ```bash theme={null} curl -X GET "https://app.leadconduit.com/firehose?service=aws&access_key_id=AKIA...&secret_access_key=wJal...&bucket=my-bucket&prefix=test" ``` *With flow ID (includes flow identifier in filename):* ```bash theme={null} curl -X GET "https://app.leadconduit.com/firehose?service=aws&access_key_id=AKIA...&secret_access_key=wJal...&bucket=my-bucket&flow_id=507f1f77bcf86cd799439011" ``` *Validation only (no file created):* ```bash theme={null} curl -X GET "https://app.leadconduit.com/firehose?service=aws&access_key_id=AKIA...&secret_access_key=wJal...&bucket=my-bucket&verification_file=false" ``` **Example Responses:** *File created:* ```json theme={null} { "validated": true, "verification_file": true } ``` *Validation only:* ```json theme={null} { "validated": true, "verification_file": false } ``` ### Azure Blob Storage Validation The `/firehose` endpoint validates Azure credentials by: 1. Creating a BlobServiceClient from the connection string 2. Checking if the specified container exists and is accessible 3. Optionally creating verification file based on `verification_file` parameter 4. Returning container validation information **Example Request:** ```bash theme={null} curl -X GET "https://app.leadconduit.com/firehose?service=azure&connection_string=DefaultEndpointsProtocol=https;AccountName=test;AccountKey=key;EndpointSuffix=core.windows.net&bucket=my-container" ``` **Example Responses:** *With verification file:* ```json theme={null} { "validated": true, "verification_file": true } ``` *Validation only (verification\_file=false):* ```json theme={null} { "validated": true, "verification_file": false } ``` ## Event Processing ### Single Service Configuration When only one service is configured, events are sent to that service. If the service fails, events are spooled for retry. ### Multi-Service Configuration When multiple services are configured: 1. Each enabled service receives the event independently 2. If a service fails, it generates its own spool message for retry 3. Each service can have different bucket/container and prefix configurations ### Spooling and Retry * Each service failure generates a separate SQS message for retry * Spooled events contain service-specific metadata (bucket, prefix, credentials) * The unspooler processes each service's failed events independently * File-based spooling creates separate paths for each service configuration ## Migration Guide ### From Legacy to Service-Based Configuration 1. **Keep existing configuration**: Legacy configuration continues to work 2. **Add services object**: Gradually migrate to service-based configuration 3. **Test thoroughly**: Validate both configurations work as expected Example migration: **Before:** ```json theme={null} { "firehose": { "enabled": true, "credential_id": "507f1f77bcf86cd799439011", "bucket": "my-bucket" } } ``` **After:** ```json theme={null} { "firehose": { "enabled": true, "services": { "aws": { "enabled": true, "credential_id": "507f1f77bcf86cd799439011", "bucket": "my-bucket" } } } } ``` # Flows Source: https://developers.activeprospect.com/api-reference/leadconduit/flows A flow defines how leads are processed. A flow can include a range of actions, including validation, normalization, and distribution, that are applied to leads as they move through the flow. Each step in the flow is represented by a "node," which can perform a specific action or set of actions on the lead. For example, a node might validate the lead's phone number or email address, normalize the lead's data, or distribute the lead to a specific destination based on predefined rules. Flows can be customized to meet the specific needs of your business, and LeadConduit offers a range of pre-built templates and tools to help you create a flow that fits your unique requirements. Overall, flows are a powerful feature of the LeadConduit platform that enable you to streamline lead processing, automate lead distribution, and improve lead quality, all while maximizing your ROI. Free accounts do not have access to Flows ([https://app.leadconduit.com/flows](https://app.leadconduit.com/flows)) and will receive a 401 (Unauthorized) error when trying to access it " # Destination Source: https://developers.activeprospect.com/api-reference/leadconduit/flows/destination # Flow Source: https://developers.activeprospect.com/api-reference/leadconduit/flows/flow # Meta Source: https://developers.activeprospect.com/api-reference/leadconduit/flows/meta # Invitations Source: https://developers.activeprospect.com/api-reference/leadconduit/invitations Invite another account to connect # Leads Source: https://developers.activeprospect.com/api-reference/leadconduit/leads Free accounts do not have access to Leads ([https://app.leadconduit.com/leads](https://app.leadconduit.com/leads)) and will receive a 401 (Unauthorized) error when trying to access it # Event Source: https://developers.activeprospect.com/api-reference/leadconduit/leads/event # Onboards Source: https://developers.activeprospect.com/api-reference/leadconduit/onboards 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. ## Overview The onboarding process involves: 1. **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 2. **In Progress** - The UI sends a PUT with the user's `flow_id` and status `in_progress` 3. **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 **Note:** The `/onboard/buyer` endpoint can also be called directly by the UI modal when the user has already completed a previous onboard process. ## Onboard Statuses | Status | Description | | ------------- | ------------------------------------------------------------------------- | | `created` | Initial state when the onboard is first created | | `in_progress` | The UI has sent the user's `flow_id` | | `completed` | The backend triggers the buyer delivery setup by calling `/onboard/buyer` | | `failed` | The setup process encountered an error | ## Buyer Setup Process The backend automatically triggers the buyer delivery setup when the onboard status is set to `completed`. This process performs: 1. **Connection Validation** - Verifies the connection exists and hasn't already been set up 2. **Seller Flow Discovery** - Finds all seller flows that have a buyer step pointing to this buyer 3. **Buyer Flow Setup** - Creates or updates the buyer's flow to receive leads from the seller 4. **Seller Flow Updates** - Adds the buyer's `flow_id` to the seller's flow mappings 5. **Notifications** - Sends email notifications to seller account users about the new connection 6. **Connection Flagging** - Marks the connection as having buyer delivery configured # Report Source: https://developers.activeprospect.com/api-reference/leadconduit/reports/report # Router Source: https://developers.activeprospect.com/api-reference/leadconduit/router # Rules Source: https://developers.activeprospect.com/api-reference/leadconduit/rules LeadConduit uses a rules engine to customize flow behavior based on field data, appended data, or internal tracking metadata (such as the submission timestamp). The rules engine is built into flow acceptance criteria, filtering, volume caps, pricing, mappings, and more. ### Rule Set Rules belong to a set which has the following properties: * `op` — `and` or `or` determines whether all rules in set must pass or just one * `rules` — the array of Rules and/or Rule Sets to evaluate ### Rules Each element of the `rules` array can be a Rule or another Rule Set. Rules have the following properties: * `lhv` — left hand value is a key to look up a value from the lead data context * `op` — operator Name of the operator * `rhv` — right hand value (omit for unary operators like `is blank`) * `rule_set` — optional rule set to be ANDed with the rule ### Variables When 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` is "lead.first\_name" and the variables are `{ "lead": { "first_name": "Bob" } }`, then the resolved `lhv` will be "Bob". ### Templating The `lhv` and `rhv` of each rule supports [templating](/docs/leadconduit/api/tag/Templates/). The variables are used to evaluate the template. # Rule Source: https://developers.activeprospect.com/api-reference/leadconduit/rules/rule # Rule set Source: https://developers.activeprospect.com/api-reference/leadconduit/rules/rule-set # Status Source: https://developers.activeprospect.com/api-reference/leadconduit/system/status # Templates Source: https://developers.activeprospect.com/api-reference/leadconduit/templates LeadConduit supports combining, [formatting](#variable-formatting), [hashing](#variable-hashing), and [performing math](#variable-math) on values using template markup. Templating in LeadConduit is based on the popular [Handlebars](https://handlebarsjs.com/) semantic templating library. A template is a string which contains any number of variable placeholders ## Template Variable Variable placeholders in templates start and end with two curly-brace characters: `{{ lead.first_name }}`. Multiple placeholders can be combined in a single template: `{{ lead.first_name }} {{ lead.last_name }}`. The [universe of possible variables](/docs/leadconduit/api/tag/Variables/) available to a template depends on the [fields](/docs/leadconduit/api/tag/Fields/) defined in your flow and the steps you've added to your flow. ## Variable Formatting LeadConduit has a built-in helper for formatting numbers and dates. Formatting a value is done with the `format` helper. If the value is a date field, then you may use date formatting options with the helper. If it's a number field, then you may use the number formatting options with the helper. ### Date Variable Formatting To format a date, use the `format` helper: `{{ format lead.dob format="YYYY-MM-DD" }}` results in '2015-06-24'. The `format` option is a string which defines the format of the date. This format can be any combination of the below tokens. To escape characters in format strings, you can wrap the characters in square brackets: `{{ format lead.dob format="[It's] MMMM Do" }}` results in "It's October 12th". #### Date Format Tokens | | Token | Output | | -------------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------ | | Month | `M` | 1 2 ... 11 12 | | | `Mo` | 1st 2nd ... 11th 12th | | | `MM` | 01 02 ... 11 12 | | | `MMM` | Jan Feb ... Nov Dec | | | `MMMM` | January February ... November December | | Quarter | `Q` | 1 2 3 4 | | | `Qo` | 1st 2nd 3rd 4th | | Day of Month | `D` | 1 2 ... 30 31 | | | `Do` | 1st 2nd ... 30th 31st | | | `DD` | 01 02 ... 30 31 | | Day of Year | `DDD` | 1 2 ... 364 365 | | | `DDDo` | 1st 2nd ... 364th 365th | | | `DDDD` | 001 002 ... 364 365 | | Day of Week | `d` | 0 1 ... 5 6 | | | `do` | 0th 1st ... 5th 6th | | | `dd` | Su Mo ... Fr Sa | | | `ddd` | Sun Mon ... Fri Sat | | | `dddd` | Sunday Monday ... Friday Saturday | | Day of Week (Locale) | `e` | 0 1 ... 5 6 | | Day of Week (ISO) | `E` | 1 2 ... 6 7 | | Week of Year | `w` | 1 2 ... 52 53 | | | `wo` | 1st 2nd ... 52nd 53rd | | | `ww` | 01 02 ... 52 53 | | Week of Year (ISO) | `W` | 1 2 ... 52 53 | | | `Wo` | 1st 2nd ... 52nd 53rd | | | `WW` | 01 02 ... 52 53 | | Year | `YY` | 70 71 ... 29 30 | | | `YYYY` | 1970 1971 ... 2029 2030 | | | `Y` | 1970 1971 ... 9999 +10000 +10001 Note: This complies with the ISO 8601 standard for dates past the year 9999 | | Week Year | `gg` | 70 71 ... 29 30 | | | `gggg` | 1970 1971 ... 2029 2030 | | Week Year (ISO) | `GG` | 70 71 ... 29 30 | | | `GGGG` | 1970 1971 ... 2029 2030 | | AM/PM | `A` | AM PM | | | `a` | am pm | | Hour | `H` | 0 1 ... 22 23 | | | `HH` | 00 01 ... 22 23 | | | `h` | 1 2 ... 11 12 | | | `hh` | 01 02 ... 11 12 | | | `k` | 1 2 ... 23 24 | | | `kk` | 01 02 ... 23 24 | | Minute | `m` | 0 1 ... 58 59 | | | `mm` | 00 01 ... 58 59 | | Second | `s` | 0 1 ... 58 59 | | | `ss` | 00 01 ... 58 59 | | Fractional Second | `S` | 0 1 ... 8 9 | | | `SS` | 00 01 ... 98 99 | | | `SSS` | 000 001 ... 998 999 | | | `SSSS ... SSSSSSSSS` | 000\[0..] 001\[0..] ... 998\[0..] 999\[0..] | | Time Zone | `z` or `zz` | EST CST ... MST PST (requires use of the `timezone` option) | | | `Z` | -07:00 -06:00 ... +06:00 +07:00 | | | `ZZ` | -0700 -0600 ... +0600 +0700 | | Unix Timestamp | `X` | 1360013296 | | Unix Millisecond Timestamp | `x` | 1360013296123 | #### Localized Date Formats Because preferred formatting differs based on locale, there are a few tokens that can be used to format a moment based on its locale. There are upper and lower case variations on the same formats. The lowercase version is intended to be the shortened version of its uppercase counterpart. To change the locale, use the `locale` options: `{{ format date format="LLL" locale="fr" }}` results in "24 june 2015 17:24". | | Format string | Output | | ------------------------------------------------- | ------------- | ----------------------------------- | | Time | `LT` | 8:30 PM | | Time with seconds | `LTS` | 8:30:25 PM | | Month numeral, day of month, year | `L` | 09/04/1986 | | | `l` | 9/4/1986 | | Month name, day of month, year | `LL` | September 4, 1986 | | | `ll` | Sep 4, 1986 | | Month name, day of month, year, time | `LLL` | September 4, 1986 8:30 PM | | | `lll` | Sep 4, 1986 8:30 PM | | Month name, day of month, day of week, year, time | `LLLL` | Thursday, September 4, 1986 8:30 PM | | | `llll` | Thu, Sep 4, 1986 8:30 PM | ### Number Variable Formatting To format a number, use the `format` helper: `{{ format lead.mortgage.first_mortgage_balance format="$0,0.00"}}` results in '\$45,302.00'. The `format` option is a string which defines the format of the number. See the table of examples below: | Number | Format | String | | ---------- | ------------ | ------------- | | 10000 | `0,0.0000` | 10,000.0000 | | 10000.23 | `0,0` | 10,000 | | 10000.23 | `+0,0` | +10,000 | | -10000 | `0,0.0` | -10,000.0 | | 10000.1234 | `0.000` | 10000.123 | | 100.1234 | `00000` | 00100 | | 1000.1234 | `000000,0` | 001,000 | | 10 | `000.00` | 010.00 | | 10000.1234 | `0[.]00000` | 10000.12340 | | -10000 | `(0,0.0000)` | (10,000.0000) | | -0.23 | `.00` | -.23 | | -0.23 | `(.00)` | (.23) | | 0.23 | `0.00000` | 0.23000 | | 0.23 | `0.0[0000]` | 0.23 | | 1230974 | `0.0a` | 1.2m | | 1460 | `0 a` | 1 k | | -104000 | `0a` | -104k | | 1 | `0o` | 1st | | 100 | `0o` | 100th | | 1000.234 | `$0,0.00` | \$1,000.23 | | 1000.2 | `0,0[.]00 $` | 1,000.20 \$ | | 1001 | `$ 0,0[.]00` | \$ 1,001 | | -1000.234 | `($0,0)` | (\$1,000) | | -1000.234 | `$0.00` | -\$1000.23 | | 1230974 | `($ 0.00 a)` | \$ 1.23 m | Use the `locale` option to format the number to a particular locale: `{{ format lead.mortgage.first_mortgage_balance locale="fr" format="$0,0.00" }}` results in '€45 302.00'. ### Converting Number and Boolean to String Fields of type number and boolean can be converted to string using the `format` helper with the `dataType="String"` option: `{{format field_name dataType="String"}}` Example: * Input: `{{format lead.age dataType="String"}}` with `lead.age` = 30 * Output: "30" ### Converting String to Number Fields 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. Examples: * Input: `{{format lead.postal_code dataType="Number"}}` with `lead.postal_code` = '78751' * Output: 78751 (as a number value) If the string does not represent a valid number, the result will not be converted: * Input: `{{format lead.postal_code dataType="Number"}}` with `lead.postal_code` = 'H3Z 2Y7' * Output: 'H3Z 2Y7' This can also be used with dates if the formatting returns only numbers, such as epoch time: * Input: `{{format lead.source_timestamp format="X" dataType="Number"}}` with `lead.source_timestamp` = '2015-06-24T17:24:49.060Z' * Output: 1435166689 (as a number value) ## Variable String Manipulation Strings can be manipulated with the following helpers: ### Lowercase Transforms the value to lowercase: `{{lowercase field_name}}` Example: * Input: `{{lowercase lead.first_name}}` with `lead.first_name` = "Mike" * Output: "mike" ### Uppercase Transforms the value to uppercase: `{{uppercase field_name}}` Example: * Input: `{{uppercase lead.first_name}}` with `lead.first_name` = "Mike" * Output: "MIKE" ### Substring Returns 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: `{{substring field_name start="3"}}` Example: * Input: `{{substring lead.first_name start="3"}}` with `lead.first_name` = "Michael" * Output: "chael" `{{substring field_name start="2" end="4"}}` Example: * Input: `{{substring lead.first_name start="2" end="4"}}` with `lead.first_name` = "Michael" * Output: "ich" ### Replace Replaces the pattern with the content of the replace option. The pattern can be a literal string or a regular expression using the `regexp()` option: `{{replace field_name pattern="Mi" replace="At"}}` Example: * Input: `{{replace lead.first_name pattern="Mi" replace="At"}}` with `lead.first_name` = "Michael" * Output: "Atchael" `{{replace field_name pattern="regexp(h.{3})" replace="ke"}}` Example: * Input: `{{replace lead.first_name pattern="regexp(h.{3})" replace="ke"}}` with `lead.first_name` = "Michael" * Output: "Micke" ### Extract Extracts all occurrences found with the regular expression in the pattern: `{{extract field_name pattern="\$begin:math:display$(.*?)\\$end:math:display$"}}` Example: * Input: `{{ extract foo pattern="(?\<=#)(\\w+)(?=#)" }}` with `lead.first_name` = "#John#Doe#Smith" * Output: "John Doe" ## Variable Math To perform math operations, use the `math` helper: `{{ math "1 + 1" }}` results in `2`. Of course, variables can also be used: `{{ math "1 + lead.random_number" }}` might result in `32` depending on the value of `lead.random_number`. The math expression accepts a pretty basic grammar. Operators have the normal precedence: | Operator | Associativity | Description | | -------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------- | | (...) | None | Grouping | | f(), x.y | Left | Function call, property access | | ! | Left | Factorial | | ^ | Right | Exponentiation | | +, -, not, sqrt, etc. | Right | Unary prefix operators (see below for the full list) | | \*, /, % | Left | Multiplication, division, remainder | | +, -, \|\| | Left | Addition, subtraction, concatenation | | ==, !=, >=, \<=, >, \<, in | Left | Equals, not equals, etc. "in" means "is the left operand included in the right array operand?" (disabled by default) | | and | Left | Logical AND | | or | Left | Logical OR | | x ? y : z | Right | Ternary conditional (if x then y else z) | There are also several pre-defined functions: | Function | Description | | ------------- | ------------------------------------------------------------------------------------------------------- | | sin(x) | Sine of x (x is in radians) | | cos(x) | Cosine of x (x is in radians) | | tan(x) | Tangent of x (x is… well, you know) | | asin(x) | Arc sine of x (in radians) | | acos(x) | Arc cosine of x (in radians) | | atan(x) | Arc tangent of x (in radians) | | sqrt(x) | Square root of x. Result is NaN (Not a Number) if x is negative. | | log(x) | Natural logarithm of x (not base-10). It’s log instead of ln because that’s what JavaScript calls it. | | abs(x) | Absolute value (magnitude) of x | | ceil(x) | Ceiling of x — the smallest integer that’s >= x. | | floor(x) | Floor of x — the largest integer that’s \<= x | | round(x) | X, rounded to the nearest integer, using "grade-school rounding" | | roundTo(x, n) | Rounds x to n places after the decimal point | | exp(x) | ex (exponential/antilogarithm function with base e) | | random(n) | Get a random number in the range \[0, n). If n is zero, or not provided, it defaults to 1. | | fac(n) | n! (factorial of n: “n \* (n-1) \* (n-2) \* … \* 2 \* 1″) | | min(a,b,...) | Get the smallest (“minimum”) number in the list | | max(a,b,...) | Get the largest (“maximum”) number in the list | | pyt(a, b) | Pythagorean function, i.e. the c in “c2 = a2 + b2“ | | 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 | | atan2(y, x) | arc tangent of x/y. i.e. the angle between (0, 0) and (x, y) in radians | | if(c, a, b) | Function form of c ? a : b | #### Example To calculate the loan-to-value ratio, given a mortgage loan amount and the value of the home: `{{ math "(lead.mortgage.loan.amount / lead.mortgage.new_property_value) * 100" }}%`. Note that this example expresses the LTV as a percentage, first by calculating the percentage and then by appending the `%` character outside the variable placeholder. This could instead be handled using [formatting](#variable-math-formatting). ### Variable Math Formatting The `math` helper supports the same options as the `format` helper for numbers: `format` and `locale`. For example, to calculate the loan-to-value ratio and format it as a percentage: `{{ math "lead.mortgage.loan.amount / lead.mortgage.new_property_value" format="0.[00]%" }}`. This would return the LTV percentage with up to 2 decimal points (i.e. 72.93%) as a string value. ## Variable Hashing LeadConduit supports a wide variety of hashing functions that can be applied to variables in a template. The helper name determines the hashing algorithm. For example, to use MD5 to hash the email address use: `{{ md5 lead.email }}`. All the following hashing algorithms are supported: * md4 * md5 * ripemd * ripemd160 * sha1 * sha224 * sha256 * sha384 * sha512 * whirlpool Multiple values can be hashed together: `{{ md5 lead.email lead.phone_1 }}`. This can be used to salt the hash also: `{{ md5 lead.email "this is my salt" }}`. The `salt` option can also be used. This is the equivalent of the last example: `{{ md5 lead.email salt="this is my salt" }}`. Hashing supports multiple encodings using the `encoding` option: `{{ md5 lead.email encoding="base64" }}` results in something like "tkK0IXs0sejTvZFfxlxEUg==". The following encodings are supported: * `hex` (default) * `base64` * `latin1` # Types Source: https://developers.activeprospect.com/api-reference/leadconduit/types A type defines the kind of data LeadConduit expects in a field or in a data point appended to a lead by any LeadConduit integration. LeadConduit uses a field's type to understand a value submitted with a lead. Types are simple and are all provided "out of the box" by LeadConduit. You cannot add or remove types. Standard LeadConduit fields are properly typed. If you need to create a custom field for some reason, you can set the type. A field's type... * determines whether a field's value is valid * normalizes the formatting of a value * parses a value into it's constituent components for use in flow rules and mappings * protects consumer PII by masking sensitive information before LeadConduit stores it * preserves the raw value submitted to LeadConduit, just in case ## Boolean Boolean fields and variables are declared as type `boolean`. | Component | Type | Description | | --------- | ------- | ------------------------------------------------------------ | | `raw` | string | Unmodified field value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a boolean | | `normal` | boolean | The normalized value (i.e. `"Yes"` is normalized to `true`) | ## City City fields and variables are declared as type `city`. ## Credential Credential fields and variables are declared as type `credential`. ## Date Date fields and variables are declared as type `date`. | Component | Type | Description | | --------- | ------- | ------------------------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a date | | `normal` | string | The normalized value (i.e. `"10/1/1988"` is normalized to `"1988-10-01"`) | ### Supported Formats | Format | Example | | ------------------ | -------------------------- | | `ddd MMM DD YYYY` | `"Mon Jun 02 2014"` | | `MMM DD YYYY` | `"Jun 02 2014"` | | `M/D/YYYY` | `"6/2/2014 or 06/02/2014"` | | `M/D/YY` | `"6/2/14"` | | `YYYY-MM-DD` | `"2014-06-02"` | | `MM-DD-YYYY` | `"06-02-2014"` | | `MMDDYYYY` | `"06022014"` | | `YYYYMMDD` | `"20140602"` | | `"ddd DD MMM YYYY` | `"Fri 18 July 2014"` | | `"DD MMM YYYY"` | `"18 July 2014"` | | `"D/M/YYYY"` | `"18/7/2014"` | | `"D/M/YY"` | `"18/7/14"` | | `"YYYY-DD-MM"` | `"2014-18-07"` | | `"DD-MM-YYYY"` | `"18-07-2014"` | | `"DDMMYYYY"` | `"18072014"` | | `"YYYY-DD-MM"` | `"2014-18-07"` | | `"YYYYDDMM"` | `"20141807"` | ## Date of Birth Date of birth fields and variables are declared as type `dob`. See the [date type](/api-reference/leadconduit/types#date) for supported formats. | Component | Type | Description | | --------- | ------- | ------------------------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a date | | `normal` | string | The normalized value (i.e. `"10/1/1988"` is normalized to `"1988-10-01"`) | ## Email Email fields and variables are declared as type `email`. | Component | Type | Description | | --------------- | ------- | ------------------------------------------------------------------------------------------------ | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as an email address | | `normal` | string | The normalized value (i.e. `"MIKEJONES32@gmail.com"` is normalized to `"mikejones32@gmail.com"`) | | `user` | string | User name (everything to the left of @) | | `domain` | string | Domain name (everything to the right of @) | | `host` | string | Domain excluding top level domain | | `tld` | string | Top level domain (.com, .net, etc) | | `is_free` | boolean | Whether or not the email is from a free domain (ex: gmail, yahoo, etc) | | `is_disposable` | boolean | Whether or not the email is disposable | ## First Name Email fields and variables are declared as type `first_name`. ## Gender Gender fields and variables are declared as type `gender`. Values are parsed case insensitively. Examples of valid gender values are: "male", "m", "female", "f", "other", "o". | Component | Type | Description | | --------- | ------- | ----------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a gender | | `normal` | string | The normalized value (`"male"`, `"female"`, `"other"`) | | `abbr` | string | Abbreviation of the `normal` value (`"M"`, `"F"`, `"O"`) | ## Last Name Last name fields and variables are declared as type `last_name`. ## Number Number fields and variables are declared as type `number`. Decimal and negative numbers are supported. Currency and unit punctuation characters are ignored. | Component | Type | Description | | --------- | ------- | ----------------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a number | | `normal` | number | The normalized value (i.e. `"$100.99"` is normalized to `100.99`) | ## Phone Phone fields and variables are declared as type `phone`. This data type only supports US phone numbers. | Component | Type | Description | | ------------- | ------- | -------------------------------------------------------------------------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a phone number | | `normal` | string | The normalized value (i.e. `"(281) 330-8004"` is normalized to `"2813308004"`) | | `area` | string | Area code portion of the phone number (i.e. `"281"`) | | `exchange` | string | Exchange portion of the phone number (i.e. `"330"`) | | `line` | string | Line number portion of the phone number (i.e. `"8004"`) | | `number` | string | Full number (i.e. `"3308004"` | | `extension` | string | Phone number extension (i.e. `"2813308004x201" has extension `"201"\`) | | `type` | string | Phone number type based on hint `m`, `h`, or `w` appended to the number- (i.e. `"(281) 330-8004m"` has type of `"mobile"`) | | `is_tollfree` | boolean | Phone has an `area` of 800, 844, 855, 866, 877, or 888 | ### Supported Formats | Format | Description | | -------------------- | -------------------------------------------------------- | | `"2813308004"` | Ten-digit phone number | | `"281-330-8004"` | Ten-digit phone number with dashes | | `"281.330.8004"` | Ten-digit phone number with dots | | `"281 330 8004"` | Ten-digit phone number with spaces | | `"(281) 330-8004"` | Ten-digit phone number with parentheses, space, and dash | | `"1 (281) 330-8004"` | Any supported format with preceding country code | ### Line Type Hint If a raw phone number value has line type hint appended, the phone type will automatically set the `type` value appropriately. For example, the `c` hint found in `281-330-8004 (c)` (c indicates "cell") will cause the `type` value to be set to "mobile". Hints can immediately follow the phone number, can be separated by the phone by any number of spaces, and can also optionally be wrapped in parentheses. | Phone Number | `type` Value | | ----------------- | ------------ | | `"2813308004c` | "mobile" | | `"2813308004m` | "mobile" | | `"2813308004 m` | "mobile" | | `"2813308004 (m)` | "mobile" | | `"2813308004w` | "work" | | `"2813308004h` | "home" | ### Extension Hint If a raw phone number value has an extension hint appended, the phone type will automatically set the `extension` value appropriately. For example, the `x201` hint found in `281-330-8004 x201` will cause the `extension` value to be set to `"201"`. Hints can immediately follow the phone number, can be separated by the phone by any number of spaces. ## Postal Code Postal Code fields and variables are declared as type `postal_code`. | Component | Type | Description | | -------------- | ------- | -------------------------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a postal code | | `normal` | string | The normalized value (i.e. `"78704 4224"` is normalized to `"78704-4224"`) | | `country_code` | string | Two letter country abbreviation (i.e. `"US"`) | | `zip` | string | First 5 digits of a US zip code (i.e. `"78704"`) | | `four` | string | Last 4 digits of a US zip code (i.e. `"4424"` | | `fsa` | string | Canadian forward sortation area (i.e. `"Q2E 4U7"` has `fsa` of `"Q2E"`) | | `ldu` | string | Canadian forward sortation area (i.e. `"Q2E 4U7"` has `fsa` of `"47U"`) | | `outcode` | string | Great Britain outward code (i.e. `"A1 1AA"` has `outcode` of `"A1"`) | | `incode` | string | Great Britain inward code (i.e. `"A1 1AA"` has `incode` of `"1AA"`) | ## Range Range fields and variables are declared as type `range`. A range is a field value with lower and upper numeric boundaries. Range fields are commonly used in scenarios where a consumer is presented a drop-down. For example, the standard `credit_score` range field might have the value `"700 - 749"`. | Component | Type | Description | | --------- | ------- | --------------------------------------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a range value | | `normal` | string | The normalized value (i.e. `"700 to 749"` is normalized to `"700-749"`) | | `min` | number | The lower boundary of the range (i.e. `700`) | | `max` | number | The upper boundary of the range (i.e. `749`) | | `avg` | number | The average of the `min` and `max` accurate to the second decimal place (i.e. `724.50`) | | `mid` | number | Average of max and min, rounded down to the nearest whole number (i.e. `724`) | ## SSN US Social Security Number fields and variables are declared as type `ssn`. | Component | Type | Description | | ------------- | ------- | -------------------------------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a Social Security Number | | `normal` | string | The normalized SSN value (i.e. `"1234567890`") | | `first_three` | string | First three digits of SSN (i.e. SSN `"123-456-7890"` has `first_three` of`"123"` | | `middle_two` | string | Middle two digits of SSN (i.e. SSN `"123-456-7890"` has `first_three` of`"456"` | | `last_four` | string | Last four digits of SSN (i.e. SSN `"123-456-7890"` has `first_three` of`"7890"` | ## State Locality or State fields and variables are declared as type `state`. | Component | Type | Description | | --------- | ------- | ----------------------------------------------------------------------------------------------------------------- | | `raw` | string | Unmodified value submitted with the lead | | `valid` | boolean | Indicates whether the value could be understood as a locality or state | | `normal` | string | The normalized locality or state. US states and territories are normalized to their two letter code (i.e. `"TX"`) | | `name` | string | Full name of the locality or state (i.e `"Texas"`) | ## String String fields and variables are declared as type `string`. ## Time Time fields and variables are declared as type `time`. # Variables Source: https://developers.activeprospect.com/api-reference/leadconduit/variables A variable is a key/value pair that is available to filters, rule sets and mappings and in templates at run time while processing a lead. Every lead is born with a standard set of variables, and additional variables are added at run-time as leads are processed by each step in the flow. The full set of variables are stored on every event (in the `vars` property) generated during lead processing. Variables are stored on events as nested objects and are referenced at runtime using dot-notation. There are several top-level variable prefixes that logically group variables. # Variables Source: https://developers.activeprospect.com/api-reference/leadconduit/variables/variables # Fetch a single event Source: https://developers.activeprospect.com/api-reference/leads/fetch-a-single-event /api-reference/leadconduit_api.json get /events/{id} # List all events Source: https://developers.activeprospect.com/api-reference/leads/list-all-events /api-reference/leadconduit_api.json get /events The `/events` resource is used to query [events](/docs/leadconduit/api/tag/Leads/#tag/Leads/schema/Event) generated while handling leads. For each lead, one event is generated for each configured [flow step](/docs/leadconduit/api/tag/Flows/#tag/Flows/schema/Flow) that handles the lead. After lead processing completes, a source event is also recorded. # List all events for exports Source: https://developers.activeprospect.com/api-reference/leads/list-all-events-for-exports /api-reference/leadconduit_api.json post /events The `/events` resource is used to query [events](/docs/leadconduit/api/tag/Leads/#tag/Leads/schema/Event) generated while handling leads. For each lead, one event is generated for each configured [flow step](/docs/leadconduit/api/tag/Flows/#tag/Flows/schema/Flow) that handles the lead. After lead processing completes, a source event is also recorded. # Retrieve statistics on events Source: https://developers.activeprospect.com/api-reference/leads/retrieve-statistics-on-events /api-reference/leadconduit_api.json get /events/stats The `/events/stats` resource is used to count events. The event count can be grouped by any field collected with the lead or appended to the lead during flow processing. The API also supports returning results in JSON or CSV using the appropriate MIME type in the `Accept` header. # Search leads Source: https://developers.activeprospect.com/api-reference/leads/search-leads /api-reference/leadconduit_api.json get /search/leads The `/search/leads` resource is used to find leads using full text search. For example, you can search for `fred` in `texas` using: ``` /search/leads?query=fred+tx ``` ## Search Criteria * pass in the search text using the query parameter: `/search/leads?query=fred` * the query parameter should be URL encoded * searching is case-insensitive: `FRED` and `fred` will both match `Fred` * you don't have to enter a complete word - searching will match the beginning of words: `/search/leads?query=sam` will match `sam` and `samantha` * queries with multiple words like `fred tx` will match leads that have both `fred` AND `tx` * to specify an exact phrase (with spaces), use double quotes - `"fred tx"` will only match that exact text The search results can be sorted and paginated. There are two query parameter to control sorting: `sort_by` and `sort_dir`. The `sort_by` parameter takes a field name (see list below) and `sort_dir` is ascending (`asc`) or descending (`desc`). By default, the results are sorted by relevance. There are two query parameters to control paging: `from` and `limit`. The `from` parameter specifies the starting offset of that page in the search results and the `limit` parameter specifies how many search results to return. From is zero-based so to get the first 10 results, use `from=0&limit=10`, the second 10 using `from=10&limit=10`, etc... The maximum `limit` is 100 at a time, with an overall maximum of 1,000 search results. ## Search Results The search results has the total number of matching leads and an array of hits, where each hit is a matching Lead Search Result. Each lead search result contains basic information about the lead, the latest event for that lead, and highlighting of the matched text. # Complete buyer delivery setup Source: https://developers.activeprospect.com/api-reference/onboards/complete-buyer-delivery-setup /api-reference/leadconduit_api.json post /onboard/buyer Completes the buyer delivery setup process for a connection. This endpoint performs several operations: 1. Validates the connection_id or resolves it from invitation_id 2. Finds the seller account and their flows that deliver to this buyer 3. Updates or creates a buyer flow with the seller as a source 4. Updates seller flows with the buyer's flow_id mapping 5. Sends notification emails to seller account users 6. Marks the connection as having buyer delivery setup complete **Note:** Either `connection_id` or `invitation_id` must be provided. **Version Note:** - In the first version of the onboarding modal, this endpoint is called directly by the frontend. - In the second version, this endpoint will be called automatically by the backend when the onboard status changes to `completed_flows_sync`. # Create a new onboard Source: https://developers.activeprospect.com/api-reference/onboards/create-a-new-onboard /api-reference/leadconduit_api.json post /onboards 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. # Get an onboard Source: https://developers.activeprospect.com/api-reference/onboards/get-an-onboard /api-reference/leadconduit_api.json get /onboards/{id} Returns the onboard record associated with the given ID # List all onboards Source: https://developers.activeprospect.com/api-reference/onboards/list-all-onboards /api-reference/leadconduit_api.json get /onboards Returns all the onboard records for the authenticated account. Onboards track the status of buyer connection setup processes. # Update an existing onboard Source: https://developers.activeprospect.com/api-reference/onboards/update-an-existing-onboard /api-reference/leadconduit_api.json put /onboards/{id} 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: 1. Find the seller account and their flows that deliver to this buyer 2. Update or create a buyer flow with the seller as a source 3. Update seller flows with the buyer's flow_id mapping 4. Send notification emails to seller account users 5. Mark the connection as having buyer delivery setup complete **Important:** Ensure all required fields (invitation_id, connection_id) are properly set before marking the onboard as completed. # Generate Ping URL Source: https://developers.activeprospect.com/api-reference/ping/generate-ping-url /api-reference/trustedform_v3.json get /{cert_id}/ping_url When a lead vendor only provides a TrustedForm Certificate URL, you can generate a new Ping URL for the Certificate. Simply append `/ping_url` to the Certificate URL and perform an unauthenticated `GET`. Each call to this endpoint will generate a new Ping URL, they are all equally valid. A successful call to this endpoint does not guarantee that the Certificate URL you have provided is valid and unexpired. The [standard Certificate expiration window](https://community.activeprospect.com/questions/4077147) still applies. # Retrieve Ping Data Source: https://developers.activeprospect.com/api-reference/ping/retrieve-ping-data /api-reference/trustedform_v2.yaml get /{cert_id}/ping Retrieve ping data directly from a Certificate. When a lead vendor only provides a TrustedForm Certificate URL, Ping data can be retrieved directly without a Ping URL. Simply append `/ping` to the Certificate URL and perform an authenticated `GET`. A certificate's Ping data can be accessed two ways: - Querying a modified TrustedForm Certificate URL - Querying a vendor-provided TrustedForm Ping URL # Retrieving Ping Data Source: https://developers.activeprospect.com/api-reference/ping/retrieving-ping-data /api-reference/trustedform_v3.json post /{cert_id}/ping Retrieve ping data directly from a Certificate. When a lead vendor only provides a TrustedForm Certificate URL, Ping data can be retrieved directly without a Ping URL. Simply append `/ping` to the Certificate URL and perform an authenticated `POST`. # Clear's a reports share token Source: https://developers.activeprospect.com/api-reference/reports/clears-a-reports-share-token /api-reference/leadconduit_api.json put /reports/{id}/unshare Unshare a report by clearing the report's token. # Create a new report Source: https://developers.activeprospect.com/api-reference/reports/create-a-new-report /api-reference/leadconduit_api.json post /reports Create a new report, adding it to the list of all reports in the account. # Create a report without saving it Source: https://developers.activeprospect.com/api-reference/reports/create-a-report-without-saving-it /api-reference/leadconduit_api.json post /reports/preview Create a report but don't save it. The report definition is provided in the post body and the time range is provided as query parameters. # Delete a report Source: https://developers.activeprospect.com/api-reference/reports/delete-a-report /api-reference/leadconduit_api.json delete /reports/{id} Delete an existing report. # Fetch a report's token Source: https://developers.activeprospect.com/api-reference/reports/fetch-a-reports-token /api-reference/leadconduit_api.json put /reports/{id}/share Share a report by generating a new token for a report. Once the token is retrieved, you can use it in place of the ID in the `/reports/:id` endpoint. # Fetch a single report Source: https://developers.activeprospect.com/api-reference/reports/fetch-a-single-report /api-reference/leadconduit_api.json get /reports/{id} Get the report definition for an individual report. The parameter can be a report id, which requires passing the api_key or a report token, which does not. # Get report metadata Source: https://developers.activeprospect.com/api-reference/reports/get-report-metadata /api-reference/leadconduit_api.json get /reports/{token}/meta Get the metadata for a report that was shared. # List all reports Source: https://developers.activeprospect.com/api-reference/reports/list-all-reports /api-reference/leadconduit_api.json get /reports Get the list of all reports. # Run a report Source: https://developers.activeprospect.com/api-reference/reports/run-a-report /api-reference/leadconduit_api.json get /reports/{id}/run Run a report that was previously created. The parameter can be an id or token. The time range is provided as query parameters. # Update an existing report Source: https://developers.activeprospect.com/api-reference/reports/update-an-existing-report /api-reference/leadconduit_api.json put /reports/{id} Update an existing report. Note that the token cannot be updated with this call. Use the /share endpoint to generate a new token and `/unshare` to clear it. # Retrieve Certificate Insights Source: https://developers.activeprospect.com/api-reference/retrieving-insights/retrieve-certificate-insights /api-reference/trustedform_v3.json post /{cert_id_} Account holders using TrustedForm Insights who are receiving certified leads can use the following request to retrieve TrustedForm metadata for the lead contained in a TrustedForm certificate. # Create a router Source: https://developers.activeprospect.com/api-reference/routers/create-a-router /api-reference/leadconduit_api.json post /routers Create a new custom router, adding it to the list of all routers in the account. # Get a router Source: https://developers.activeprospect.com/api-reference/routers/get-a-router /api-reference/leadconduit_api.json get /routers/{id} Fetch a single router. # List all routers Source: https://developers.activeprospect.com/api-reference/routers/list-all-routers /api-reference/leadconduit_api.json get /routers Get the list of all routers. # Update a router Source: https://developers.activeprospect.com/api-reference/routers/update-a-router /api-reference/leadconduit_api.json put /routers/{id} Update an existing custom router. Standard routers cannot be updated. # Get system status Source: https://developers.activeprospect.com/api-reference/system/get-system-status /api-reference/leadconduit_api.json get /status Shows the general status of the system # Get UI app version Source: https://developers.activeprospect.com/api-reference/system/get-ui-app-version /api-reference/leadconduit_api.json get /version/ui Returns the current UI app version. # Check-in Source: https://developers.activeprospect.com/api-reference/trustedform-certificate-check-in/check-in /api-reference/trustedform_v3.json post /{cert_id}/check_in Check-in supports various actions for a TrustedForm Certificate (e.g. extending the claim period on certificates). Failing to make the authenticated API call within the [standard claim period](https://community.activeprospect.com/questions/4077147) (72 hours of generating the lead) will result in the irretrievable deletion of the certificate. # Overview Source: https://developers.activeprospect.com/api-reference/trustedform/v2/overview TrustedForm account holders who are receiving certified leads should use our API to claim the certificate provided with each lead. Doing so verifies the legitimacy of the certificate, stores the certificate for future reference, and provides programmatic access to the information shown on the certificate. To claim a certificate, send an HTTP POST request to the certificate URL sent by your publisher. * Do not make a request unless the URL starts with `https://cert.trustedform.com`, otherwise you may expose your TrustedForm credentials to someone else * Use a POST request — any other type of request will not claim the certificate * Use the `Accept: application/json` request header * Use the `Content-Type: application/json` or `Content-Type: application/x-www-form-urlencoded` header, and encode the request body accordingly * Use the API key provided on the "Settings" tab in the [TrustedForm Application](https://app.trustedform.com/#account) and the username 'API' ## Reference When you claim a certificate, you can pass the optional `reference` parameter. We will store this value along with your claimed certificate. The general idea is that you can pass your lead identifier which will provide a back-reference to the certified lead that you received. This will allow you to know which lead a certificate belongs to, just by examining the certificate data. In the case that your publisher has passed you a two leads with the same Certificate URL, this reference parameter will allow you to determine which lead it was originally passed with. If you are a LeadConduit customer, the LeadConduit Lead URL will be automatically sent as the reference. This allows you to refer back to the lead with which an individual certificate was collected. ## Vendor When claiming a certificate, you can pass the optional `vendor` parameter. We will store this value along with your claimed certificate. Later when you use TrustedForm reporting, you can easily filter or group by vendor. If you use our LeadConduit platform, the vendor will be automatically sent with each certificate claim request. ## Fingerprints When you claim a certificate you can calculate lead fingerprint values using the email and phone number you received in the lead data accompanying the certificate. Each fingerprint value is a SHA1 hash of a email or phone value. Each fingerprint value should be provided in a `fingerprint` parameter. If at least one of the fingerprints you provide does not match one of those collected on the certificate you will receive the `none of the provided fingerprints match` in the claim `warnings` field. This indicates that the lead data collected on the form does not match the lead data that you received. If you use our LeadConduit platform, the fingerprints will be automatically calculated and sent with each certificate claim request. If you are accessing our API directly, see our [instructions for generating a lead fingerprint](https://community.activeprospect.com/posts/4112710-calculating-lead-fingerprints-with-trustedform). ## Snapshot Scanning To assist in enforcing compliance, TrustedForm can scan the certificate's HTML snapshot to ensure specific phrases are (or are not) present. If you scan for required text (disclosure terms, for example), the TrustedForm response will include a warning if that text isn't found in the snapshot. Alternately, you can scan for forbidden text (disallowed ad copy, for instance), in which case the response will include a warning if the text *is* found. ### Scanning for Required Text To search for required text, pass the search text as the `scan` parameter when you claim the certificate. TrustedForm will then perform a case- and whitespace-insensitive search for the string. If the string is not found in the HTML document, then "string not found in snapshot" will be included in the `warnings` key of the claim response. If you'd like to search for many different strings, you'll need to use the parameter array syntax: `scan[]=example&scan[]=another%20example`. Depending on your setup, you may need to URL encode the square brackets. ### Scanning for Forbidden Text To search for forbidden text, use the `scan!` parameter in the claim call instead. If TrustedForm's case- and whitespace-insensitive search finds that text in the HTML document, then the message "string found in snapshot" will be given in the `warnings` key of the claim response. Note that aside from ignoring whitespace and text case, TrustedForm's scans are literal, including any special characters that you pass. You may include either or both of `scan` and `scan!` in a single claim call. You would then need to look for the corresponding messages in the `warnings` key of the claim response ("string not found in snapshot" or "string found in snapshot", respectively). As with scanning for required text, you may pass multiple forbidden text scans with the parameter array syntax: `scan![]=example&scan![]=another%20example`. Again, depending on your setup, you may need to URL encode the square brackets. ## Masked Certificates A [masked certificate](https://community.activeprospect.com/questions/4062880) is generated for every claim. You can obtain the URL to it from the `masked_cert_url` field of the response JSON when you claim a certificate. You can then share it with your buyers. They can claim it using the same [claiming instructions](https://community.activeprospect.com/posts/4100303-claiming-a-trustedform-certificate-via-the-api) as a normal certificate. ## Response Codes * If you successfully claim a certificate, an [HTTP 201 Created](http://en.wikipedia.org/wiki/HTTP_201) will be returned with the JSON representation of the certificate in the response body. Beware that using an HTTP GET will also return an HTTP 200 along with the HTML representation of the certificate — your cert will not be claimed with an HTTP GET. * If the certificate is older than 3 days or if the certificate URL is invalid, then an [HTTP 404 Not Found](http://en.wikipedia.org/wiki/HTTP_404) will be returned. * If you have not [authenticated](https://community.activeprospect.com/posts/4112178-trustedform-api-overview) correctly using your API key, an [HTTP 403 Forbidden](http://en.wikipedia.org/wiki/HTTP_403) will be returned. If you receive any response code other than those above, please [let us know](mailto:support@activeprospect.com). ## Pings (Deprecated) When you ping a certificate, you are requesting profile information about that particular TrustedForm Certificate. See Ping documentation for additional information on utilizing the ping method. ## Claims When you claim a certificate, a claim record is created and stored in TrustedForm and the JSON response body contains claim record. See Claim documentation for additional information on claim records. # Overview Source: https://developers.activeprospect.com/api-reference/trustedform/v3/overview ## Claiming Claiming a certificate will allow you to verify its legitimacy, view it online, access its data via our API, and refer to the snapshot that was taken of the page as seen by the consumer, for up to 30 days. And you can easily configure your account to keep certificates for as long as you like, for a small additional fee. ### Claim Period The "claim period" is the time in which a TrustedForm Certificate must be claimed or extended by a TrustedForm Account holder. If it's not, it will expire. * The standard claim period is approximately 72 hours (3 days). * The extended claim period is approximately 2,160 hours (90 days). Within the claim period, TrustedForm Certificates are visible to anyone with access to the TrustedForm Certificate URL. After this period, TrustedForm Certificates are only accessible by the TrustedForm account holders that claimed them. ## Extended Certs By default, Web Certs have a 72-hour (3 days) window in which they can be claimed. This window is automatically expanded to 90 days if we detect the form's submission. If you have need to extend Certs beyond the default 3-day window, you have a couple options: 1. Cert check-in 2. Enable extended claims ### Cert Check-in ActiveProspect provides TrustedForm Check-in to allow TrustedForm account holders to extend the claim period of certificates beyond the standard claim period. Checking a certificate in extends the claim period without the need to either claim the certificate or have "Extended Claims" enabled on the publishing account. ### Enable Extended Claims When you enable extended claims, Certificates you claim will automatically be extended and available to be claimed up to 90 days. Reach out to your account representative to enable extended claims. ## Ping (Deprecated) The TrustedForm Ping API is meant to be used by lead buyers purchasing leads using the "ping/post" model. This API gives buyers access to that data with the intention that it will be called when the buyer is evaluating a ping request from a seller. The buyer can then use the returned data to set an appropriate bid price. ### Comparison to Claim API The Ping API does not replace the TrustedForm Claim process. The Ping API cannot be used to verify or store consent for TCPA compliance. It does not support page scanning, fingerprinting, replay, or certificate storage. Please refer to the [Getting Started with Claiming](/docs/trustedform/getting-started-with-claiming/) for details on claiming a certificate. # Other information ## Prerequisites * [Add the TrustedForm script](https://activeprospect.com/products/trustedform-for-publishers/) to your lead forms. * Contact [support@activeprospect.com](mailto:support@activeprospect.com) to receive an API key. # Certificate URL Source: https://developers.activeprospect.com/api-reference/trustedform/v4/certificate-url Each Certificate URL acts as the endpoint to a simple RPC API. The HTTP methods listed in this section are used to interact with an individual certificate. Certificate URLs follow a common format, though the format of a certificate ID depends on how the certificate was issued. ``` https://cert.trustedform.com/eb9fc4dd9bed9ad451a5648946cf4bf09b5bb947 ``` # Sending on Ping Source: https://developers.activeprospect.com/api-reference/trustedform/v4/certificate/sending-on-ping Each TrustedForm certificate captures a session replay of what the consumer saw when they filled out the offer form. The full certificate, including the replay, is visible to any account holder that has retained the certificate using the `retain` operation. In order to protect consumer privacy, the certificate hides form input fields recorded in the session replay by default. In other words, simply retaining a certificate is insufficient for accessing the consumer's PII because it cannot be seen in the replay. This means that a certificate URL can be safely passed to a lead buyer on ping. As long as the phone number and email address are withheld, the buyer cannot access the consumer's PII. The buyer can only examine the certificate using `insights` to see if it meets their requirements. When the lead is posted with the certificate URL and the email or phone, the buyer can use `match_lead` and `retain` together to both [unlock the PII in the session replay](https://community.activeprospect.com/posts/5021187-lead-matching-when-viewing-a-trustedform-certificate?utm_source=beamer\&utm_medium=standalone\&utm_campaign=TrustedForms-Enhanced-PII-Protection\&utm_content=textlink) and also store the certificate. **Important:** If you are pinging a buyer who uses LeadConduit, none of the data you provide on ping can be accessed by the buyer. Because of this, it's perfectly safe to pass the certificate URL and all PII on ping to LeadConduit. Doing so can dramatically reduce post-rejects since LeadConduit is able to evaluate the entire lead on ping. # Types Source: https://developers.activeprospect.com/api-reference/trustedform/v4/certificate/types TrustedForm can issue certificates appropriate for several types of lead origination. Each certificate type has a different certificate ID format and supports different Insights data points. ### Web Web certs are generated using our javascript web SDK. [Sign up online](https://account.activeprospect.com/trustedform/script) for a free TrustedForm Certify account to access the web SDK. Web cert IDs look like this: ``` eb9fc4dd9bed9ad451a5648946cf4bf09b5bb947 ``` By default, web certs have a 72-hour (3 day) window during which they are available to API callers. This window is automatically expanded to 90 days if the certificate recorded a form submission event. After this window has elapsed, certificate API calls will return an HTTP 404. ### Mobile App Mobile app certificates are generated using our mobile SDK for iOS or Android. Contact [sales@activeprospect.com](mailto:sales@activeprospect.com) for more information. Mobile app certificates look like this: ``` 11NgkzK_mroUbOD1-x66NigDliU1kdvbaCtLGvyja1K80vU1sKh9grlwP78vzKSp4ncwAfJAlNPNVY8f ``` Mobile app certificates have a 90 day window during which they are available to API callers. After this window has elapsed, certificate API calls will return an HTTP 404. ### Meta Lead Ads Meta Lead Ads certificates are supported through LeadConduit. Contact [sales@activeprospect.com](mailto:sales@activeprospect.com) for more information. Meta Lead Ads cert IDs look like this: ``` 0.rpM21ddljS9BNNUOm6FZVVqb5C5JMk1cofI4nDGdwy5ezucyxjok9qLyUXMu9diW62Xac8xNMpomBf1B-XDpfbYvaFMr0YC-54TzHcLrni4.OHOMoMFXaX9YW9DoX_xeng.1vnf6DTWU7sJo6XAxlRP_w ``` Meta Lead Ads certificates have a 90 day window during which they are available to API callers. After this window has elapsed, certificate API calls will return an HTTP 404. # Operations Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations The HTTP `POST` method called on the certificate URL is a RPC API. That API is organized around "operations." Each operation can be called with parameters in the JSON request body. The HTTP response body contains the result of each specified operation. The structure of the parameters and response is symmetrical. That is, the parameters are echoed back in the response. The operation response body also contains a `result` property that returns the outcome of the operation. **IMPORTANT:** Each operation is contracted separately so you may not be able to use them all. Additionally, each operation is billed separately has incurs a unit cost each time the operation is run. If you are using this API in a ping/post lead buying arrangement, you might consider using only the `insights` operation on ping and the `retain` operation on post. That way, you can use the insights data points to inform your bid price. If you win the auction for a lead you will then store the certificate on post using the `retain` operation. # Insights Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/insights The `insights` operation retrieves metadata about the lead event that generated a TrustedForm certificate. The properties included in the response can be used to filter and/or route your leads to optimize your business strategies. More information is available in [our knowledge base](https://community.activeprospect.com/posts/4709758-trustedform-insights). **Important:** Requires a Professional plan or higher. The effective unit cost for an insights call depends on the Insights data points retrieved. # Match Lead Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/match-lead The `match_lead` operation allows you to check whether the email address and/or phone number of the lead you have against what is recorded on the certificate. Before being converted to a hash to be stored email addresses and phone numbers are normalized. Email addresses are simply downcased while phone numbers remove all whitespace, hyphens, brackets and parentheses. This normalization is also applied to the values of lead matching parameters to help legitimate matches be made when the formatting is different. **Important:** The `match_lead` operation is required when running the `retain` operation. # Retain Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/retain The `retain` operation stores a TrustedForm certificate in your account per your account retention setting (defaults to 5 years). This should be performed for all certificates associated with leads you intend to contact so that you have proof of the events that took place. **Important:** When retaining a certificate, you must also execute the `match_lead` operation. This ensures that the lead with which you received the certificate matches the lead data collected on the cert. Requires a Self-Service plan or higher. # InsightsParameters Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/schemas/InsightsParameters # InsightsResult Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/schemas/InsightsResult # MatchLeadParameters Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/schemas/MatchLeadParameters # MatchLeadResult Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/schemas/MatchLeadResult # RetainParameters Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/schemas/RetainParameters # RetainResult Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/schemas/RetainResult # VerifyParameters Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/schemas/VerifyParameters # VerifyResult Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/schemas/VerifyResult # Verify Source: https://developers.activeprospect.com/api-reference/trustedform/v4/operations/verify The verify operation uses data from lead events and the source from which they originated to verify that a consumer gave their express written consent to be contacted as defined by the requirements configured in your account. **Important** * Verify requires a Self-Service plan or higher. * For Facebook certificates, consent language is detected only if it is included in the [custom disclaimer section](https://www.facebook.com/business/help/1550411888622740?id=735435806665862). # Viewing a Certificate Source: https://developers.activeprospect.com/api-reference/viewing-certificates/viewing-a-certificate /api-reference/trustedform_v3.json get /{cert_id} When you claim a certificate, TrustedForm returns either a "consent" or "consent+data" JSON response depending on your subscription. You can "view" this same response by sending a `GET` request to the same endpoint. The following list provides examples of when you might want to use this endpoint: - You were unable to capture the initial response - You need to validate if you've claimed the certificate # ActiveProspect Documentation Source: https://developers.activeprospect.com/index Explore our guides and examples to integrate with our APIs ## Setting up Our real-time lead optimization platform that empowers you to take action on your leads. The renowned lead certification product that helps you comply with national regulations like the TCPA by documenting consumer consent. We offer over 380 different marketing integrations and custom solutions tailor-made to your needs. ## Use our quick-start guides for faster setup. Install and configure TrustedForm Certify in your website to start documenting consent immediately. Use LeadConduit to start receiving and enhancing lead data in real-time. # Authentication Source: https://developers.activeprospect.com/pages/leadconduit/authentication Unless otherwise noted, all calls to resources exposed by the ActiveProspect APIs require authentication. The APIs use HTTP Basic Authentication. In place of the password, use your account API key. The username is ignored so you can provide whatever value you like. This documentation uses API as the username. ## Example Throughout this documentation you will see examples that look similar to that shown below. This examples uses the ubiquitous `curl` shell command. The `-uX:1234567890` portion of that command specifies the HTTP Basic Authentication credentials. In this example `X` is the username and `1234567890` is the API key. ``` $ curl -X GET -uX:1234567890 -H 'Accept: application/json' https://app.leadconduit.com/flows ``` If the `-u` argument is omitted from an example, you may assume that it does not require authentication. ## Failure to Authenticate When you fail to provide the correct HTTP Basic Auth credentials, you will receive an HTTP 401 (Unauthorized) response that looks like this: ``` HTTP/1.1 401 Unauthorized Date: Tue, 28 Jul 2015 03:29:16 GMT Content-Type: application/json; charset=utf-8 Content-Length: 33 Connection: keep-alive Vary: Accept, Accept-Encoding ETag: W/"21-48c58abe" {"error":"authentication failed"} ``` ## API Key Your API key is used to authenticate all calls to the API. This key is private. Treat it like a password. Only give it out to people you trust. Your API key works with all ActiveProspect products to which you are subscribed. You can retrieve your API key via the ActiveProspect ID account settings. ### Resetting your API key You can reset your API key via your ActiveProspect ID account settings. After you have reset it, you must propagate the new key to each of the ActiveProspect products to which you are subscribed by logging into them in turn. The act of logging in to a product causes the key to propagate to that product. Once you reset the API key in your ActiveProspect ID account settings, and log into a product your old key will immediately stop working and your new key will start working. # Authentication Source: https://developers.activeprospect.com/pages/trustedform/authentication Unless otherwise noted, all calls to resources exposed by the ActiveProspect APIs require authentication. The APIs use HTTP Basic Authentication. In place of the password, use your account API key. The username is ignored so you can provide whatever value you like. This documentation uses API as the username. ## Example Throughout this documentation you will see examples that look similar to that shown below. This examples uses the ubiquitous `curl` shell command. The `-uX:1234567890` portion of that command specifies the HTTP Basic Authentication credentials. In this example `X` is the username and `1234567890` is the API key. ``` $ curl -X GET -uX:1234567890 -H 'Accept: application/json' https://app.leadconduit.com/flows ``` If the `-u` argument is omitted from an example, you may assume that it does not require authentication. ## Failure to Authenticate When you fail to provide the correct HTTP Basic Auth credentials, you will receive an HTTP 401 (Unauthorized) response that looks like this: ``` HTTP/1.1 401 Unauthorized Date: Tue, 28 Jul 2015 03:29:16 GMT Content-Type: application/json; charset=utf-8 Content-Length: 33 Connection: keep-alive Vary: Accept, Accept-Encoding ETag: W/"21-48c58abe" {"error":"authentication failed"} ``` ## API Key Your API key is used to authenticate all calls to the API. This key is private. Treat it like a password. Only give it out to people you trust. Your API key works with all ActiveProspect products to which you are subscribed. You can retrieve your API key via the ActiveProspect ID account settings. ### Resetting your API key You can reset your API key via your ActiveProspect ID account settings. After you have reset it, you must propagate the new key to each of the ActiveProspect products to which you are subscribed by logging into them in turn. The act of logging in to a product causes the key to propagate to that product. Once you reset the API key in your ActiveProspect ID account settings, and log into a product your old key will immediately stop working and your new key will start working. # Adding TrustedForm Consent Tags Source: https://developers.activeprospect.com/pages/trustedform/consent-tagging ## Overview *TrustedForm Certify requires website owners to add consent tags to their lead generation forms to accurately assess how their practices align with business requirements, particularly in terms of compliance and lead quality. In order for lead buyers to verify this in an automated fashion, the lead generator must add specific tags to elements of their lead form using HTML attributes. This document provides instructions to do so.* ## Implementation Note that failure to include or tag elements correctly could result in TrustedForm certificates failing various checks/filters. Any misrepresentation of elements in order to circumvent protections that TrustedForm puts in place could result in a loss of service. ### Prerequisite Configure the Certify Web SDK with the query parameter `use_tagged_consent` equal to true. For assistance visit the Issuing Certificates section of the TrustedForm application, enable the “Use Consent Tags” script configuration, copy the updated Javascript Snippet and add this to your website (replacing any existing implementations). ### Tags required to enable lead buyers to use all current TrustedForm Verify features * `offer` * `submit` * `consent-language` * one (but not both) of the following: * `consent-advertiser-name` * `consent-opted-advertiser-input-n` and its corresponding `consent-opted-advertiser-name-n` tag ### data-tf-element-role To tag elements of your lead form, add an attribute with the name `data-tf-element-role` and the appropriate value specified below. If your form does not contain the element described in the description of the value then do not add it. Click here to view an interactive example of a form that has implemented consent tags correctly. This attribute can take any one of the following values: * offer The offer element is the highest level element. It should be a DOM element that completely captures the area where consent and any of its requirements are given. Pages with multiple marketing offers (e.g. attempts to sell different goods/services) should tag each one separately. ```html theme={null}
``` or flattened ```html theme={null}
``` * submit This attribute should be attached to the Submit button or other DOM element which requires a consumer action to create the lead. There must be exactly one submit for every offer element. ```html theme={null}
By clicking Submit I grant consent.
``` * submit-text This attribute should be attached to the text label that identifies the name of the button or DOM element that will trigger the lead creation. The text inside this tag should be identical to the label on the submit element. ```html theme={null}
By clicking Submit I grant consent.
``` * consent-language This should be attached to an element containing or surrounding the text which describes everything the consumer is consenting to. There must be at least one consent language for every offer element. ```html theme={null}
``` * consent-opt-in This attribute indicates a control the consumer must select to acknowledge that consent is being granted. It should be opted out by default, forcing a consumer action to opt in. The attribute should be attached to an input element nested inside the consent language element or referred to through a for attribute. It is highly recommended that there is one of these for every consent-language element. ```html nested theme={null}
``` ```html flat theme={null}
``` * consent-advertiser-name This attribute should be attached to the text identifying the name of the advertiser being granted consent to contact. This tag should be used when consent is only given to one advertiser to whom the consumer is always giving consent by submitting the form.
Warning: when adding consent-advertiser-name to a parent element, any visible text found inside it or any child elements will be considered part of the advertiser name. This will affect the outcome of the Verify request.
```html theme={null}
By clicking Submit. I grant consent for Cogswell Cogs to contact me.
``` *
consent-opted-advertiser-input-n
*
consent-opted-advertiser-name-n
These attributes should be attached to the text identifying the name of the advertiser optionally being granted consent to contact and the input used to indicate this . This tag should be used whenever the consumer must take an action to select the advertiser(s) being given consent to contact. Replace the character ‘n’ with a unique value for each advertiser listed. The value can be any string as long as it matches the value in the corresponding checkbox.
Warning: when adding consent-opted-advertiser-name-n to a parent element, any visible text found inside it or any child elements will be considered part of the advertiser name. This will affect the outcome of the Verify request.
```html theme={null}
By clicking Submit. I grant consent for the following firms to contact me:
``` * contact-method This attribute indicates the methods by which the consumer consents to be contacted. This should be attached to an element containing or surrounding the text inside of the consent language that describes all possible methods by which the consumer consents to be contacted (e.g. phone, text, email) ```html theme={null}
By clicking Submit I, John Doe hereby grant consent to be contacted by phone At 631-555-1212 .
``` *
consent-grantor-name
*
consent-grantor-phone
*
consent-grantor-email
*
consent-grantor-address
These attributes should be attached to any text based or input element specifying contact information of the person granting consent to be contacted. ```html theme={null}
By clicking Submit I, John Doe hereby grant consent to be contacted by phone At 631-555-1212 .
``` ```html theme={null}
By clicking Submit I, hereby grant consent to be contacted by phone at the number above.
``` *
consent-grantor-waived-dnc
This should be attached to an element containing or surrounding the text inside of the consent language that specifically gives consent to call even if the number is found on a Do Not Call registry. ```html theme={null}
By clicking Submit. I hereby grant consent to be contacted even if my phone number is listed on a Do Not Call Registry.
``` * consent-grantor-waived-purchase-condition This should be attached to an element containing or surrounding the text inside of the consent language where the consumer documents that they understand this contact does not oblige them to any purchases. ```html theme={null}
By clicking Submit. I hereby grant consent to be contacted and I understand that my agreement to be contacted is not a condition of purchasing any property, goods or services.
``` * consent-grantor-waived-regulated-technologies This should be attached to an element containing or surrounding the text inside of the consent language that specifically gives consent to use regulated technologies (e.g. automated dialing systems, pre-recorded voice, artificial intelligence, SMS/MMS) ```html theme={null}
By clicking Submit. I hereby grant consent to be contacted and permit that contact to be from an automated calling system.
``` Click here to view an interactive example of a form that has implemented consent tags correctly. # Getting Started Source: https://developers.activeprospect.com/pages/trustedform/getting-started A TrustedForm Certificate is a collection of all the information necessary to document a consumer's interaction with a lead generation form. If the consumer submits the form it becomes a lead event. Certificates have a limited time to live (90 days for lead events / 3 days otherwise). During this time API requests can be made to them to store a viewable copy of the certificate in your account, retrieve data related to the lead event and more. If you are a publisher or lead generator looking to create TrustedForm Certificates view [Implementing TrustedForm Certify](/pages/trustedform/implementing-trustedform-certify) for instructions on how to add our SDK to your lead generation forms. The API is intended to be used by lead buyers or aggregators who interact with the leads you create. ## Step 1: Make sure your leads have TrustedForm Certificate URLs If you are already receiving leads, you need to make sure that a TrustedForm Certificate URL is included as part of the lead data. This will ensure that you are able to use our products as soon as you sign up. If you are purchasing leads from a third party source ask them to sign up for [TrustedForm Certify](https://activeprospect.com/trustedform/certify/) and implement it on all their sources. If you are generating your own first party leads then consider using the [Auto-Retain method](https://activeprospect.com/trustedform/auto-retain/) instead of the API. ## Step 2: Get an ActiveProspect Account or upgrade your existing account You can sign-up for a self-service account [here](https://account.activeprospect.com/trustedform/register) or [contact sales](https://activeprospect.com/trustedform/retain/#form). If you already have an account but have not yet added payment information, make sure to do that now otherwise your account will not be authorized to make API requests. Self service accounts have limited functionality and access to support. You are encouraged to use the self-service option while exploring or if you have a only want to store a small number of certificates each month. Otherwise a sales director will be best able to offer you a more customized solution to meet your business needs. ## Step 3: Set up your API request and monitor the response You will need to use or build a system which can make API requests on your behalf. ActiveProspect offers [LeadConduit](https://activeprospect.com/leadconduit), a lead optimization platform which can be configured to do this without any technical knowledge. Otherwise, consult your LMS, CRM or other similar systems to determine if they have this capability. Use the API documentation for specifications on how to perform the actions you desire and use TrustedForm Certificates. The API response will include an `outcome` property that should be used to determine whether or not to accept leads. If the `outcome` is success that indicates there are no concerns and the lead should be accepted. If the `outcome` is failure you should manually review the lead and/or reject it. The process for lead rejections should always be negotiated with your lead provider beforehand. If the `outcome` is error you should review the response, fix any issues with your request and retry as appropriate. ## Step 4: Review your certificates If you opted to retain copies of TrustedForm certificates in your account, make sure to visit the Certificate URL in your browser while logged into your account and review them for accuracy. Watch the session replay and report any issues with the content displayed to the source of the lead. If there are any technical issues [submit a report](https://support.activeprospect.com/hc/en-us/requests/new?) to our support team. # Implementing the TrustedForm Certify Web SDK Source: https://developers.activeprospect.com/pages/trustedform/implementing-trustedform-certify # Implementing the TrustedForm Certify Web SDK [Sign up online](https://account.activeprospect.com/trustedform/script) for a free TrustedForm Certify account to start generating certificates. TrustedForm Certify generates a new certificate for each page a consumer lands on that is running the Certify Web SDK. Adding it to your web forms is quick and easy, and we've carefully engineered it to load quickly. The usage of the Web SDK is governed by our [TrustedForm Certify Web SDK End User License Agreement](http://activeprospect.com/legal/trustedform-eula). Looking to certify leads from a social media or mobile application? [Contact Us](https://activeprospect.com/trustedform/lead-generation/#form) With the TrustedForm Certify Web SDK added to your HTML page, TrustedForm Certificate URLs will start to be generated and passed along with the rest of the data submitted in the form. The SDK does this by adding a hidden field in your web form and inserting the URL into those fields. The field is then captured by your server when the form is submitted and can be passed along to the lead buyers as proof that the lead was collected on your site. The hidden field: ```html theme={null} ``` ## TrustedForm Certify Web SDK Prerequisites In order to add the Web SDK to your page, the following prerequisites need to be met: * Landing pages and form builder platforms must support * Custom JavaScript * Custom Hidden Fields * The TrustedForm Certify Web SDK must be in the same "window" as the form * e.g. if the form is injected onto the page via an iFrame, the TrustedForm Certify Web SDK must also be in this iFrame * The form must be present in the page before loading the TrustedForm Certify Web SDK. * If the form is injected into the page code after the TrustedForm Certify Web SDK starts, the hidden field will not be appended to the form. * The lead capture process should ideally occur on a single web page so all user interactions are captured within a single TrustedForm certificate. * For multi-step flows, use a **single-page application (SPA)** so the entire experience is recorded in one certificate * If multiple web pages are used, **multiple certificates will be generated** * If certificates are passed to a partner, coordinate with them to ensure the certificate(s) meet their requirements * Additional Resources: [TrustedForm Certify and Multi-step Forms](https://support.activeprospect.com/hc/en-us/articles/45686409940756-TrustedForm-Certify-and-Multi-step-Forms), [Capturing Leads From a Co-Registration Offer Path](https://support.activeprospect.com/hc/en-us/articles/44098177861140-Capturing-Leads-From-a-Co-Registration-Offer-Path) Please check with your landing page or form builder platform provider to confirm they support these prerequisites and can provide you the proper documentation or support personnel to meet these requirements. ## Add the TrustedForm Certify Web SDK to Your Form If you don't already have the TrustedForm Certify Web SDK, you can register for it on the [TrustedForm Certify](https://activeprospect.com/trustedform/certify) page. Alternatively, if you have a TrustedForm account, you can visit the [Issuing Certificates](https://app.trustedform.com/certificates/issue) tab in the TrustedForm app. Once registered or in the app, you will see a JavaScript snippet. Once you have the snippet, add it to your page just before the closing `` tag. ### Troubleshooting If TrustedForm certificates are not being created please ensure you followed all the steps above and check your browser's developer console for any errors. If everything looks good, here are a few additional reasons why certificates are not being created or experiencing issues. * TrustedForm Certify is being executed before a form has been added to the page * An AdBlocker is preventing TrustedForm Certify from executing * JavaScript is disabled on the browser * Poor internet connection * Other scripts are preventing TrustedForm Certify from executing before the form is submitted * Website assets are not publicly accessible * TrustedForm is experiencing an [outage](https://status.activeprospect.com/) ### Tips to help TrustedForm capture data more reliably * Use a `