LogoLogo
Changelog
18.5
18.5
  • Welcome
    • Welcome to Airkit đź‘‹
    • Quickstart
  • Concepts
    • Sessions
      • Linking to Sessions
    • Actors
      • Conversations with Actors
  • Tutorials
    • Building A Contact Form
      • Building the Web UI
      • Building the Database
      • Finalizing the App
      • Connecting Forms to Salesforce
    • Styles, Themes, and Templates
      • Changing the header
      • Changing the Theme
      • Using a custom font
      • Using Animations
    • Multi-Page Form
      • Creating the App Object in AirData
      • Building the Form’s UI
      • Creating the Data Flow to insert data
      • Connecting the Data Flow to the UI
      • Previewing and Publishing the app
    • Scheduling and Follow-Up App
      • Collecting Contact Information
      • Creating Appointment Times
      • Saving Appointment Information
      • Scheduling Appointment Reminder
      • Automating Proactive Follow-Up
      • Requesting Feedback
    • Custom Integrations (Petfinder App)
      • Querying the Petfinder API
      • Displaying Petfinder Data
  • Platform
    • Console
      • Apps
      • Activity
      • App Health
      • Datastores
      • Integrations
      • Conversations
      • Resources
      • API
      • Settings
    • Studio
      • Builder Bar
        • Triggers Builder
        • Web Flows Builder
        • Chat Bots Builder
        • Answer Flows Builder
        • Voice Bots Builder
        • Connections Builder
        • Notifications Builder
        • AirData Builder
        • Media Library
        • Theme Builder
        • Schedules Builder
        • Settings
      • App Preview
      • Data Flows
      • Variable Tree
      • Data Model Editor
      • Events
        • Session Started Events
        • Trigger Events
        • Control Events
        • Session Events
        • Activity Group Events
        • Action Chains
  • Data and Integrations
    • Working with Data
      • Variable Namespaces
      • Standard Session Data
      • AirData
        • AirData App Objects
        • Datastores
        • Identity Objects
        • Place Objects
        • Schedule Objects
      • Airscript Quickstart
        • Working with Dates and Times
        • Working with Missing Values
        • Working with URLs and Base64
      • Pull Values from Lists and Objects
        • Path Expressions
        • Query Expressions
      • Making Forms from Data Models
    • Integrations
      • First Party Integrations
        • Creating A Salesforce Lead
        • Creating a Zendesk Ticket
        • Creating SFTP Credentials
        • Swagger Schema Validation
        • First Party Integration Reference
          • Airtable Integration
          • Genesys Widget Integration
          • Google Integration
          • Guidewire Integration
          • Hubspot Integration
          • Kustomer Integration
          • MX Integration
          • Plaid Integration
          • Salesforce Integration
          • SendGrid Integration
          • SFTP Integration
          • Shopify Integration
          • Stripe Integration
          • Twilio Integration
          • Zendesk Integration
      • Custom Integrations
        • OAuth 2.0
        • API Token
        • HTTP Basic Auth
        • Custom Token
        • SFTP
        • Examples: Twitter and Giphy
      • App APIs
        • Building an App API
      • Subscriptions (Web Hooks)
  • Texts, Calls and Emails
    • SMS
      • SMS Notification Basics
      • Chat Bot Basics
      • Texting Journey Links
      • Data from Inbound Calls/SMS
      • Connecting Twilio Numbers
    • Emails
      • Email Notification Basics
      • Sending Emails by Data Operation
      • Connecting Email Addresses
    • Voice Bots
      • Voice Bot Basics
    • Conversation Chat Bots
      • Setting Up Answer Groups
      • Configuring Conversation Chat Bots
        • Salesforce Relays
        • Kustomer Relays
  • Web Apps
    • Forms
      • Displaying Controls Dynamically
      • Repeating Elements
      • Prefilling Forms
      • Validation of User Data
      • Capture Secure User Data
      • Progress Bars
      • Dropdown Menus
      • Electronic Signatures
    • Calendars
      • Customizing Schedule Availability
      • Using Availability Schedules
      • Rescheduling Deflected Calls
      • Integrating to External Calendars
    • Maps and Addresses
      • Maps
      • Addresses
      • User's Current Location
      • Address Search Map Binding
    • Payments
      • Creating a Stripe Integration
    • Timers and Reminders
      • Setting Timers
      • Setting up Periodic Tasks
    • PDFs
      • Creating a PDF
      • Working with Existing PDFs
      • Adding Assets to PDF
    • Assets and Media
      • Using the File Upload Web Control
      • Working with Files and Media
      • Assets and Data Operations
      • Sending Assets to Remote Servers
    • Styling Overview
      • Web Control Styling Properties
        • Animations
      • Themes and Control Variants
        • Importing and Exporting Themes
      • Working with Custom Assets
      • Page Layouts
        • Creating an App Header
    • Publishing
      • Publish and Manage Deployments
      • Configure Application Resources
      • Editing an Application
      • Importing/Exporting Apps
      • Tying Variables to Deployments
    • Advanced
      • Custom Controls
      • Creating Custom Functions
    • Accessibility
      • Accessibility in Airkit
      • Connecting Labels to Input Controls
  • Authentication
    • SAML Authentication
    • OAuth 2.0 - Google
    • OAuth 2.0 - Okta
    • OAuth 2.0 - Auth0
    • Azure AD B2C
    • Authentication Apps and Secure Apps
  • Embeds
    • SDK Overview
      • SDK Quickstart
      • SDK Authentication
      • Passing Data
      • Configuration
      • Configuration Examples
      • Airkit Lightning Component (Salesforce)
  • Analytics and Administration
    • Airkit Organizations
    • Adding Users to Airkit
    • User Roles
      • Working with Custom Roles
    • JIT Provisioning for an Organization
    • SAML SSO for an Organization
    • Managing the Application Lifecycle
    • Environments
      • Environmental Governance
    • Getting Application Metadata
    • Custom Domains
    • Analytics Overview
      • App Events to Splunk
      • App Events to AWS S3 Buckets
      • Audit Logs to AWS S3 Buckets
      • View Data in Activity Explorer
      • Snowflake Analytics Schema
      • Power BI
      • Heap and GTM Integrations
        • Setting up Analytics with GTM
        • Setting up Analytics with Heap
    • Error Management
      • Logging Errors
      • Setting up Email Notifiers
      • Integrating Error Notifiers to Slack
  • Security and Compliance
    • App Security FAQ
    • Data Masking and Auditing
    • IP Ranges
    • Encrypting Data
    • SSL Auth
    • TCPA
    • Cookie Policies
    • Supported Browsers
    • Realms
  • Reference Docs
    • Reference Documentation Overview
    • Airscript
      • Text Functions
        • CAPITALIZE
        • CONCAT
        • ISSTRING
        • LOWERCASE
        • PADSTRING
        • REPLACE
        • REPT
        • SPLIT
        • STRING_COMPARE
        • STRING_FIND
        • STRIP
        • SUBSTITUTE
        • SUBSTRING
        • TITLECASE
        • TRIM
        • UPPERCASE
      • DateTime Functions
        • ADD_TO_DATE
        • ADD_TO_DATETIME
        • DATE
        • DATETIME
        • DATETIME_DELTA
        • DATETIME_FROM_FORMAT
        • DATETIME_FROM_TIMESTAMP
        • DATE_DELTA
        • DATE_FROM_DATETIME
        • DATE_FROM_FORMAT
        • DAY
        • DAYS
        • FORMAT_DATE
        • FORMAT_DATETIME
        • FORMAT_TIME
        • HOUR
        • ISO_WEEK
        • MINUTE
        • MONTH
        • NOW
        • SECOND
        • SUBTRACT_FROM_DATE
        • SUBTRACT_FROM_DATETIME
        • TIME
        • TIMESTAMP_FROM_DATETIME
        • TIME_DELTA
        • TIME_FROM_DATETIME
        • TIME_FROM_FORMAT
        • TODAY
        • UPDATE_DATE
        • UPDATE_DATETIME
        • UPDATE_DAY
        • UPDATE_HOUR
        • UPDATE_MILLISECOND
        • UPDATE_MINUTE
        • UPDATE_MONTH
        • UPDATE_SECOND
        • UPDATE_TIME
        • UPDATE_TIMEZONE
        • UPDATE_YEAR
        • WEEK
        • WEEKDAY
        • YEAR
      • List Functions
        • CONTAINS
        • FIRST
        • FLAT
        • JOIN
        • LAST
        • LENGTH
        • REMOVE_EMPTY
        • REVERSE
        • SHUFFLE
      • Object Functions
        • KEYS
        • MERGE_OBJECTS
        • OBJECT_TO_SOAP
        • OBJECT_TO_XML
        • SOAP_TO_OBJECT
        • SOAP_HEADER_TO_OBJECT
        • VALUES
        • XML_TO_OBJECT
      • Math Functions
        • ABS
        • ACOS
        • ACOSH
        • ACOT
        • ACOTH
        • ASIN
        • ASINH
        • ATAN
        • ATAN2
        • ATANH
        • CEILING
        • COMBIN
        • COMBINA
        • COS
        • COSH
        • COT
        • COTH
        • CSC
        • CSCH
        • DEGREES
        • EVEN
        • EXP
        • FACT
        • FACTDOUBLE
        • FLOOR
        • GCD
        • ISEVEN
        • ISNUMBER
        • ISODD
        • LATLNGDISTANCE
        • LCM
        • LN
        • LOG
        • MAX
        • MIN
        • MROUND
        • MULTINOMIAL
        • ODD
        • PI
        • POWER
        • PRODUCT
        • RADIANS
        • RANDOM
        • RANGE
        • ROUND
        • ROUNDDOWN
        • ROUNDUP
        • SEC
        • SECH
        • SIGN
        • SIN
        • SINH
        • SQRT
        • SQRTPI
        • SUM
        • SUMSQ
        • TAN
        • TANH
        • TRUNC
      • Conditional Functions
        • EQUAL
        • IF
        • ISEMPTY
        • ISNOTEMPTY
        • NOT
      • Currency Functions
        • CURRENCY
        • FORMAT_CURRENCY
        • PARSE_CURRENCY
      • Phone Functions
        • FORMAT_PHONE
        • ISPHONE
        • PARSE_PHONE
      • Email Functions
        • ISEMAIL
      • Number Formatting Functions
        • ARABIC
        • FORMAT_NUMBER
        • PARSE_NUMBER
        • ROMAN
      • Data Type Functions
        • FROM_JSON
        • TO_JSON
        • TYPEOF
      • Asset Functions
        • ASSET_SIZE
        • ASSET_STATE
        • ASSET_THUMBNAIL_URL
        • ASSET_TO_URI
        • ASSET_TYPE
        • URI_TO_ASSET
      • Encoding Functions
        • BASE
        • BASE64_DECODE
        • BASE64_ENCODE
        • HMAC_MD5
        • HMAC_SHA1
        • HMAC_SHA256
        • MD5
        • SHA1
        • SHA256
        • URL_DECODE
        • URL_ENCODE
        • UUID
        • VALUE_OF
      • Error Handling Functions
        • THROW
        • TRY
      • Form and Validation Functions
        • FIRST_VALIDATION
        • RUN_VALIDATIONS
      • Arithmetic Operators
        • Addition (+)
        • Subtraction (-)
        • Multiplication (*)
        • Division (/)
        • Remainder (%)
      • Comparison Operators
        • Equality (=)
        • Inequality (<>, !=)
        • Ordering (<, <=, > , >=)
      • Logical Operators
        • AND
        • OR
        • XOR
        • Null Coalescing Operator (??)
      • Advanced Expressions
        • LET...IN
        • User Defined Functions
    • Web Controls
      • Button
      • Checkbox
      • Chat
      • Simple Checkbox List
      • Container
      • Container List
      • Credit Card
      • Currency Input
      • Date Input
      • Date Picker
      • Dropdown List
      • Email Input
      • Embedded External Content (iFrame)
      • Fieldset Container
      • File Upload
      • Form
      • Hyperlink
      • Image
      • Inline Container
      • Label
      • Map
      • Markdown
      • Number Input
      • Payment Request Button
      • Phone Input
      • Place Search Input
      • Progress Bar
      • QR Code
      • Radio Button
      • Simple Radio List
      • Scheduler
      • Secure String Input
      • Selectable Container
      • Signature Input
      • Text Area
      • Text Input
      • Time Input
      • Web Flow
      • Web Page
    • Voice and Chat Controls
      • Decision Menu
      • Forward Call
      • Secure Touchtone Capture
      • Text Response Capture
      • Touchtone Capture
    • Data Operations
      • AirData Request
        • DELETE
        • PUT
        • INSERT
        • PATCH
        • QUERY
        • DEPRECATED_QUERY
      • Calendar Search
      • Close Conversation
      • Conversation Transcript
      • Create File
      • Delete Assets
      • Download Encoded Asset
      • Early Return
      • Fetch Agent Information
      • Fetch Asset Details
      • Fetch Routing Flow Stats
      • Find Conversations by Customer Identifier
      • Fill PDF Form
      • Google
      • HTML to PDF
      • HTTP Request
        • Using an API With Paging
      • JWT Generation
      • Merge PDF
      • Move Conversation to Routing Flow
      • Opt Out Search
      • Opt Out List
      • Run Data Flow
      • Run Event in Journey
      • Salesforce
      • Secure Value Retrieval
      • Send Email
      • Send Message to Conversation
      • SFTP
      • Start Journey
      • Swagger Schema Validation
      • Transform
      • Update Customer Identifier
      • Wait
      • XML to JSON
      • Zendesk
      • ZIP File
    • Actions
      • Analytics Identify
      • Analytics Send Event
      • Close Modal
      • Condition
      • End Session
      • Extend Session Expiration Time
      • Initialize Actor
      • Log Custom Event
      • Metric: Count
      • Metric: Field
      • Metric: Start Timer
      • Metric: Statistic
      • Metric: Stop Timer
      • Navigate To Web Flow
      • Navigate to Web Page
      • Open Modal
      • Run Data Flow
      • Run Data Flow Repeatedly
      • Run Embedded Outgoing Event
      • Run Event
      • Send Email
      • Send SMS
      • Set Authentication
      • Set Identifier
      • Set Variable
      • Start Chat Bot
      • Start Voice Bot
      • Start Timer
      • Stop Timer
      • Throw
      • Trigger Form Validation
      • Try
    • Conversation Actions
      • Ask A Question
      • Capture User Response
      • Close Conversation
      • Move Customer to Resource
      • Move Conversation to Routing Flow
      • Quick Replies
      • Run Answer Flow
      • Start Conversation Chat Bot
      • Start Conversation
      • Send Link
      • Text Answer
      • Update Customer Identifier
    • Primitive Data Types
      • Any (JSON)
      • Asset
        • Detailed Asset
      • Boolean
      • Currency
      • Date
      • DateTime
      • Email
      • List
      • Null
      • Number
      • Phone
      • Text
      • Time
  • Transportation Products Catalog
    • The Transportation Products API
      • GET products
      • GET product-by-id
  • Release Notes
    • CXR Overview
    • CXR Upgrades and Migrations
Powered by GitBook
On this page
  • Overview
  • General
  • Are data flows run server-side or client-side?
  • How long do sessions last?
  • How do you know if a session/journey has been completed?
  • Can I build an app that requires authentication?
  • Are assets uploaded to the Media Library scanned for any malware or viruses?
  • Are my API tokens in console secure?
  • How does Airkit handle App isolation?
  • Attack Prevention
  • How does Airkit prevent clickjacking?
  • How does Airkit protect against CSRF?
  • Embeds and Iframes
  • How is the CORS access policy configured?
  • Data
  • What realms are Airkit Apps and data stored?
  • Where is data in Airdata stored, and is it secure?
  • How long is data retained?
  • I am an Airkit customer that is in Europe and is subject to GDPR. How do I ensure my data stays within the EU?
  • I am an Airkit customer that is subject to HIPAA. How do I ensure my application remains HIPAA compliant.
  • Where is the data from inputs or variables stored?
  • What is the retention policy for assets created in Airkit?
  • How do I handle secure data when building in Airkit?
  • How are emails handled in Airkit?
  • TCPA
  • What are some best practices for building an application that is TCPA compliant?
  • PCI Compliance
  • What are best practices when building a PCI compliant application?

Was this helpful?

  1. Security and Compliance

App Security FAQ

PreviousIntegrating Error Notifiers to SlackNextData Masking and Auditing

Last updated 1 year ago

Was this helpful?

Overview

Here is a compiled list of common questions and answers around building secure apps with Airkit, ranging from best practices around TCPA, Airdata security and retention, session expiry, and more.

General

Are data flows run server-side or client-side?

Data flows are run server-side, which is why they have inputs and outputs. Data that is stored at the session namespace, activity group namespace, or activity namespace is stored on the client and accessible through the browser. For more information on variables scopes, see .

How long do sessions last?

By default, sessions have an expiration of 30 days. Session expiration time can be configured in Journey's can also be extended using the action in an action chain as well.

How do you know if a session/journey has been completed?

Session Activity can be monitored and seen by clicking on the menu icon > Sessions and Activity when editing an application in the studio. Journey's can also be ended manually by using the action in an action chain.

Can I build an app that requires authentication?

Yes. Airkit allows apps to be defined as Public Apps, Secure Apps, or Authentication Apps, which can be configured in . Public apps can be accessed from anyone and are open to the public for access. Secure apps can only be accessed by being redirected through an Authentication App. The Authentication App is typically a generic app that asks for a username/password (where password is collected by a Secure Text Input Control), and when submitted, calls the . If the username/password matches the authentication parameters, then the Set Authentication Action redirects the user to the Secure App Journey. The Secure App also has a cookie that can be set, which will redirect the user back to the Authentication App when it is expired.

What if I want to require authentication from a third party rather than a password?

Yes, assets uploaded to the Media library are scanned for trojans, malware, viruses and other threats. If a malicious file is detected, the asset will be rejected.

Are my API tokens in console secure?

Yes, API tokens and credentials that are uploaded via integrations are stored in an encrypted vault.

How does Airkit handle App isolation?

Attack Prevention

How does Airkit prevent clickjacking?

The Airkit platform cannot be accessed within an iframe, prevented by setting content-security-policy: frame-ancestors 'none'. This prevents clickjacking while working within the Console or Studio. As far as authentication, cookies are secure-only and have a Same-Site: Lax security policy.

To protect against clickjacking when inserting your apps into an iframe, you must explicitly allow specific target domains if you want to embed your Airkit app. The default content-security-policy only allows apps to be embedded in the Studio/Preview and (if applicable) Airkit portals. The “Embedded External Content” control sets the iframe sandbox property to allow-scripts allow-forms to provide a balance of functionality and security. Content embedded within an Airkit app may not modify the parent frame. Any application authentication cookies are secure-only and have a Same-Site: Lax security policy.

How does Airkit protect against CSRF?

Airkit limits the risks of CSRF attacks in a variety of ways. Authentication cookies require HTTPS, are inaccessible from Javascript (http-only), and have a same-site: lax policy. All API requests contain an XSRF-Token to prevent to prevent cross-domain form submission. GET requests never modify data.

Embeds and Iframes

How is the CORS access policy configured?

Data

What realms are Airkit Apps and data stored?

Where is data in Airdata stored, and is it secure?

How long is data retained?

I am an Airkit customer that is in Europe and is subject to GDPR. How do I ensure my data stays within the EU?

When an Airkit organization is provisioned, you have the ability to select a realm for where your data resides. If you select an EU realm, your data will stay within the EU-Central-1 AWS region. Please note that as a developer you have the ability to call APIs and copy data globally, the realm constraint ensures that Airkit will not move your data or processing outside of that region.

I am an Airkit customer that is subject to HIPAA. How do I ensure my application remains HIPAA compliant.

Where is the data from inputs or variables stored?

What is the retention policy for assets created in Airkit?

How do I handle secure data when building in Airkit?

How are emails handled in Airkit?

TCPA

What are some best practices for building an application that is TCPA compliant?

PCI Compliance

What are best practices when building a PCI compliant application?

Airkit allows app users to be authenticated via as well as multiple OAuth 2.0 venders, including , , and . All available OAuth app authentication options adhere to the Open ID Connect spec. When verification succeeds and the user provides consent, the user information can be surfaced via the On Authentication Success Event, and he JWT from the vendor remains in the browser as a cookie.

Are assets uploaded to the scanned for any malware or viruses?

Customer can bring as many domains () as they want. App isolation is essentially enforced at a domain level, so you can set up apps on their own subdomains if needed. The app developer has full control over where APIs and/or Apps live and which domain they're on.

When embedding your Airkit apps into your existing digital portfolio, CORS must be done on an application-by-application basis. Target hostnames are defined under Studio > Settings > Target Names. When using , these target hostnames will be applied only if Enable CORS (found under Studio > Triggers > SDK > Authentication) is checked, which is done but default upon the creation of an SDK Trigger. For more on how this is implemented, see the .

When an is provisioned, the organization and all assets pertaining to that organization are stored in a that is selected at purchasing. These realms include United States (us-west-2), Australia (ap-southeast-2), and the EU (eu-central-1). If you are not sure what realm an Airkit Organization is provisioned in, please reach out to your sales representative or reach out to support@airkit.com.

Airdata is encrypted at rest, encrypted in transit between systems and encrypted on the server itself. Our online infrastructure is built on Amazon Web Services, and Airkit maintains a SOC2, PCI, HIPAA and other controls that cover the service's security, confidentiality, availability, and integrity. For more information, see .

Data stored in Airdata is retained unless it is manually deleted. Session data, on the other hand, is stored for the length of the session duration. Session duration is configurable by the user in configuration builder and can also be extended by using the .

When an Airkit organization is provisioned, you have the ability to select a realm for where your data resides. If you select a US realm, your data will stay within the us-west-2 AWS region, and ensures that Airkit will not move your data or processing outside of the US realm. As a developer, you also have other tools available to help you build applications to help meet HIPAA requirements. Airkit supports , using Airkit's default keys or you can bring your own key, along with data tagging in AirData. There is also the so that inputs can only be accessed server-side and not saved on the browser as well as the .

Data that is input on the client is saved on the browser. If using the , the values input into that control are not surfaced on the browser. Using the secure text input control generates a secureValueKey that can be accessed through a data flow using the .

Assets in Airkit are uploaded to Amazon S3, in a separate bucket per org, per application. Assets can either created as a global asset or a private asset. Global assets are available on the CDN with a static link. Private assets have a generated link and has an expiration time which is configurable. See for more information.

Secure data can be handled by using the , , or by using PCI compliant controls such as the or the .

When using the , emails get routed through Amazon SES and do not sit on Airkit servers. Mailboxes are also not hosted by Airkit and receiving emails are the responsibility of the mailbox owner.

The best way to ensure TCPA compliance when building out an application, is to first be able to extract a user's state and timezone locale. The best way to do this, is to ask for a user's zipcode, and use a zipcode lookup API to extract state and timezone. Using this information, chat/voice bots can be triggered on that can be restricted to only run based on a TCPA calendar. The calendar restriction must be to either Do not schedule and cancel or Schedule in next available time slot. For more information on TCPA, see .

When building a PCI compliant app, ensure that no sensitive data is saved on the client. Data that is deemed sensitive should use the , and pass that data to be retrieved server side, through a data flow. Also, data that is passed to the data flow should not be returned as an output, or else the application is no longer PCI compliant. Also, when capturing credit card information, Airkit has PCI specific controls that are PCI compliant out of the box, such as and the .

here
Settings.
Extend Session Expiration Time
End Session
Settings
Set Authentication Action
SAML
Google
Okta
Auth0
Media Library
custom domains
SDKs
SDK Quickstart
Airkit Organization
realm
https://www.airkit.com/security/
The Extend Session Expiration Time Action
encryption
secure text input control
Secure Touchtone Capture Control
secure text input control
The Secure Value Retrieval Data Operation
The Asset Data Type
Secure Text Input Web Control
Secure Touchtone Capture Control
Credit Card Control
Payment Request Button Control
The Send Email Data Operation
timers
How To enforce TCPA
Secure Text Input Web Control
Credit Card Web Control
Payment Request Button Web Control